서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
일반화 관계와 함께 자식 클래스를 개별적으로 다룰 필요 없이 한 번에 처리할 수 있게 하는 수단을 제공한다.
상속과 연계되어 동작하면 매우 강력한 힘을 발휘한다.
다형성을 사용하지 않을 경우 (클래스별로 다르게 처리해줘야 함)
class Dog{
public void bark() {...}
}
class Cat{
public void meow() {...}
}
class Parrot{
public void sing() {...}
}
public class Main{
public static void main(String[] args){
Dog d = new Dog();
Cat c = new Cat();
Parrot p = new Parrot();
b.bark();
c.meow();
p.sing();
}
}
다형성을 사용 할 경우 (구체적으로 현재 어떤 클래스 객체가 참조되는지와 무관하게 프로그래밍 할 수 있음.)
abstract class Pet{
public abstract void talk();
}
class Dog extends Pet{
public void talk(){...}
}
class Cat extends Pet{
public void talk(){...}
}
class Parrot extends Pet{
public void talk(){...}
}
public class Main {
public static void groupTalk(Pet[] p) {
int i;
for(i = 0; i < 3; i++)
p.talk();
}
public static void main(String[] args) {
Pet[] p = { new Cat(), new Dog(), new Parrot() };
groupTalk(p);
}
}
일반화 관계에 있을 때 부모 클래스의 참조 변수가 자식 클래스의 객체를 참조할 수 있다.
부모 클래스의 참조 변수가 접근할 수 있는 것은 부모 클래스가 물려준 변수와 메서드뿐이다.
Reference