public class PolyTest {
public static void main(String[] args) {
// Upcasting으로 객체를 생성
// 상속관계, 재정의(Override), 동적바인딩
// [다형성(message polymorphism)]
// 상위클래스가 동일한 메시지로 하위클래스를 서로다르게 동작시키는 객체지향 원리
Animal ani = new Dog();
ani.eat(); //실행시점에서 사용될(호출될)메서드가 결정되는 바인딩(동적바인딩)
ani = new Cat();
ani.eat();
// Downcasting
((Cat)ani).night();
}
}
다형성의 전제조건
상속관계
Override(재정의)가 되어야 한다.
Upcasting(업캐스팅)
동적 바인딩
다형성 활용(다형성 인수)
하나의 타입으로 여러가지 타입을 받을 수 있다.(부모이기 때문에)
부모 클래스 활용
instanceof로 타입 검사
public class PolyMethodTest {
public static void main(String[] args) {
Dog d = new Dog();
display(d);
Cat c = new Cat();
display(c);
}
// 다형성 인수 Animal ani
private static void display(Animal ani) {
ani.eat();
// Cat 타입으로 받은 경우에만 실행 -> if
if(ani instanceof Cat){
((Cat)ani).night(); // Cat
}
}
}
다형성 활용(다형성 배열)
배열은 동일한 자료형만 저장 가능하지만 부모타입의 배열은 자식타입을 저장 가능하다. (하나의 배열에 서로 다른 타입을 저장 가능)
상위 타입 배열
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();
if(ani[i] instanceof Cat){ // Cat 타입 일때만 night 실행
((Cat)ani[i]).night();
}
}
}
}