카테고리 없음

2024. 7. 4. (목) 슈퍼코딩 부트캠프 Day 28 / 주특기 2주차

태영9922 2024. 7. 4. 16:39

 

1. Java OOP 다형성

- 다형성이란? 하나의 타입이나 메소드가 여러 타입이나 메소드들을 가지거나 실행하는 능력

package exercise.chapter_33;

public class Animal {
    protected String gender;

    public void eat(String food) {
        System.out.println("동물이 " + food + "를 먹습니다");
    }

    public void sleep() {
        System.out.println("동물이 잠을 자고 있습니다");
    }
}
...

public class Bird extends Animal {
    @Override
    public void eat(String food) {
        System.out.println("새가 " + food + "를 부리로 쪼아먹고 있습니다");
    }
}
...

public class AnimalTest {
    public static void main(String[] args) {
        Animal bird = new Bird(); //업캐스팅
        feed(bird, "모이");
    }

    public static void feed(Animal animal, String food) {
        animal.eat(food); //각 인스턴스의 오버라이딩된 메소드 실행
        // 출력 : 새가 모이를 부리로 쪼아먹고 있습니다
    }
}
 
 

2. Java 다운 캐스팅

- 부모클래스에서 자식클래스 타입으로 형변환

- 하위클래스 인스턴스인지 확인하는 방법

package exercise.chapter_33;

public class AnimalDownCasting {
    public static void main(String[] args) {
        //다운 캐스팅 확인
        Animal animal = new Bird();
        Bird bird = (Bird) animal; //다운캐스팅, Bird 인스턴스만 형변환 가능
        checkBirdAndFly(animal);

        Animal animal2 = new Animal();
        //Bird bird2 = (Bird) animal2; //오류 발생, animal2는 Animal 인스턴스임
        checkBirdAndFly(animal2);


        Animal animal3 = new Person();
        //Bird bird3 = (Bird) animal3; //오류 발생, animal3는 Person 인스턴스임
        checkBirdAndFly(animal3);
    }

    static void checkBirdAndFly(Animal animal) {
        if (animal instanceof Bird) { //animal 객체가 Bird 인스턴스인지 확인
            Bird bird = (Bird) animal;
            bird.fly();
        } else {
            System.out.println("새가 아닙니다");
        }
    }
}
/*
출력:
새가 날고 있습니다
새가 아닙니다
새가 아닙니다
*/
 
package exercise.chapter_33;

public class AnimalCasting {
    public static void main(String[] args) {
        Animal[] animals = {
                new Animal(), new Person(), new Fish(), new Bird(),
        };

        sleepTogether(animals);
        System.out.println("----------------");
        doSomethingSeparately(animals);
    }

    static void sleepTogether(Animal[] animals) {
        for (Animal animal : animals) {
            animal.sleep(); //각 인스턴스의 오버라이딩된 sleep 함수 실행
        }
    }

    static void doSomethingSeparately(Animal[] animals) {
        for (Animal animal : animals) {
            if (animal instanceof Bird) {
                Bird bird = (Bird) animal; //다운캐스팅
                bird.fly();
            } else if (animal instanceof Fish) {
                Fish fish = (Fish) animal; //다운캐스팅
                fish.swim();
            } else if (animal instanceof Person) {
                Person person = (Person) animal; //다운캐스팅
                person.walk();
            } else {
                System.out.println("동물 클래스이거나 지원하지 않는 객체");
            }
        }
    }
}
/*
출력:
동물이 잠을 자고 있습니다
사람이 자고 있습니다
물고기가 잠을 자고 있습니다
새가 잠을 자고 있습니다
----------------
동물 클래스이거나 지원하지 않는 객체
사람이 걷고 있습니다
물고기가 헤엄을 치고 있습니다
새가 날고 있습니다
*/
 

3. Java final 키워드

- final로 변화 제어 : 클래스 상속, 함수 오버라이딩 못하게 막기

public final class Animal {
...
}
...
public class Bird extends Animal { //Animal class가 final로 선언되었기 때문에 상속 불가
...
}
 
class Animal{
    public final void eat(String food) {
    ...
    }
}

class Bird extends Animal{
...
    @Override
        public void eat(String food) { 
        //부모 클래스의 eat 함수가 final로 선언되었기 때문에 오버라이드 할수 없음
    }
}
 

- final로 상수 정의

static final double PI = 3.141592;