상속관계에 있는 클래스에서 상위클래스가 하위클래스들 에게 동일한 메세지를 보냈을때, 하위클래스들이 서로 다르게 동작시키는 객체지향 원리이다.
상속관계가 되어야한다.
객체 생성을 upcasting 으로 해야한다.
(상위클래스가 하위클래스에게 메세지를 보내야 하기 때문이다)
하위클래스가 반드시 override 해야한다. (다형성 보장을 위해)
동적 바인딩을 통해 실현된다.
부모클래스를 잘 활용해야한다.
다형성 인수 활용 전
동물 class가 늘어날수록 display 메서드도 늘어나는 문제점이 있다.
따라서 프로그램을 확장하는것이 어렵다.
public class Test1 {
public static void main(String[] args) {
Dog d = new Dog();
display(d);
Cat c = new Cat();
display(c);
}
private static void display(Dog d) {
}
private static void display(Cat c) {
}
}
다형성 인수 활용 후
메서드를 하나로 만들어주고 대신 부모타입을 인자로 받는다.
이때 r을 다형성 인수라고 한다.
public class After {
public static void main(String[] args) {
Dog d = new Dog();
display(d);
Cat c = new Cat();
display(c);
}
private static void display(Animal r) {
r.eat();
// r이 Cat으로 형변환 가능하니?
if (r instanceof Cat) {
((Cat)r).night(); // downcasting
}
}
}
배열임에도 불구하고 서로 다른 타입을 저장할 수 있다.
배열에는 서로 다른 타입이 들어가면 안된다.
public class Test2 {
public static void main(String[] args) {
// 다형성 배열
// Dog, Cat 을 저장할 배열을 생성한다
Animal[] ani = new Animal[2];
ani[0] = new Dog();
ani[1]= new Cat();
for (int i = 0; i < ani.length; i++) {
ani[i].eat();
if (ani[i] instanceof Cat) {
((Cat) ani[i]).night();
}
}
System.out.println("");
System.out.println("===========disply 함수로 출력==========");
display(ani);
}
private static void display(Animal[] ani) {
for (int i = 0; i < ani.length; i++) {
ani[i].eat();
if (ani[i] instanceof Cat) {
((Cat) ani[i]).night();
}
}
}
}