다형성이란? '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현했다.
조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 하였다는 것이다.
class Tv {
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class SmartTv extends Tv {
String text;
void caption() { //내용 생략 }
}
일반적인 방법으로는 아래와 같이 인스턴스를 생성할 것이다.
Tv t = new Tv()
SmartTv s = new SmartTv()
하지만 이때 서로 상속관계에 있는 클래스라면 아래와 같이 작성이 가능하다.
Tv t = new SmartTv(); //타입 불일치. 조상 타입의 참조변수로 자손 인스턴스를 참조
이 때는 SmartTv의 text변수와 caption()메서드는 사용이 불가능하나 원래 Tv에 정의돼있던 power와 channel및 메서드등은 사용할 수 있다.
반대로 자식 클래스타입의 참조변수에는 부모 클래스타입의 인스턴스를 참조를 허용할까?
불허한다. 자식 클래스타입의 참조변수가 사용할 수 있는 멤버 개수가 부모보다 많기에 막아놨다.
SmartTv s = new Tv(); //XXX 안됨!
조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.