다형성 활용

강9·2023년 12월 6일
0

Java

목록 보기
61/71
post-thumbnail

💡 다형성이란?

message polymorphism

  • 상위클래스가 동일한 메세지로 하위클래스를 서로 다르게 동작 시키는 객체지향 이론

  • ex. 부모가 "먹다(eat)"이라는 메세지를 자식인 Dog와 Cat에게 보내면 자식 클래스는 반응을 하지만 서로 다르게 반응한다.

Animal x = new Dog();
x.eat(); // 개처럼 먹다. --> 실행 시점에서 사용될(호출될) 메서드가 결정되는 바인딩(동적바인딩)

Animal x = new Cat();
x.eat(); // 고양이처럼 먹다. --> 실행 시점에서 사용될(호출될) 메서드가 결정되는 바인딩(동적바인딩)

🔖 다형성이론 전제조건

  • 상속관계
  • Override(재정의) ★
  • Upcasting(업캐스팅)
  • 동적 바인딩

🔖 다형성 활용

📌 다형성 인수

  • 하나의 타입으로 여러가지의 타입을 받을 수 있다.
    instanceof : 타입확인 연산자
public class PolyMethodTest {
    public static void main(String[] args) {

        Dog d = new Dog();
        display(d);

        Cat c = new Cat();
        display(c);
    }
    
    public static void display(Dog d) {
        d.eat();
    }
    public static void display(Cat c) {
        c.eat();
    }

}
public class PolyMethodTest {
    public static void main(String[] args) {

        Dog d = new Dog();
        display(d);

        Cat c = new Cat();
        display(c);
    }
//    public static void display(Dog d) {
//        d.eat();
//    }
//    public static void display(Cat c) {
//        c.eat();
//    }
    public static void display(Animal ani) { // 다형성인수 : 하나의 타입으로 여러개의 타입을 받을 수 있다.
        ani.eat();

        // Cat 타입으로 받은 경우에만 실행 --> if
        // ((Cat)ani).night();
        if(ani instanceof Cat) { // instanceof --> 타입확인 연산자
            ((Cat)ani).night();
        }
    }
}

📌 다형성 배열

  • 배열은 동일한 자료형만 저장 가능하지만 부모타입의 배열은 자식타입을 저장 가능하다. (하나의 배열에 서로 다른 타입을 저장 가능)
public class PolyArrayTest {
    public static void main(String[] args) {
        Dog d = new Dog();
        Cat c = new Cat();

        // Dog, Cat 을 저장할 배열을 생성하시오.
        // Animal[] ani = {new Dog(), new Cat()};
        // 다형성 배열
        Animal[] ani = new Animal[2];
        ani[0] = d;
        ani[1] = c;
        display(ani);

    }
    public static void display(Animal[] ani) {
        for (int i = 0; i < ani.length; i++) {
            ani[i].eat(); // ani[0]=Dog, ani[1]=Cat

            if (ani[i] instanceof Cat) {
                ((Cat) ani[i]).night(); // Cat 타입일 경우에만 실행
            }

        }
    }
}
profile
코린이 일기

0개의 댓글