객체지향개념에서 다형성이란 여러가지 상태를 가질 수 있는 능력을 의미한다.
자바에서는 한 타입의 참조변수로 여러타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.
즉, 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한 것이다.
class Tv{
boolean power;
int channel;
void power(){ power = !power; }
void channelUp(){ ++channel; }
void channelDown(){ --channel; }
}
class CaptionTv extends Tv{
String text;
void caption() { //... }
}
위 와 같은 클래스들이 있을 때, 인스턴스를 생성하는 방법은 아래와 같다.
Tv t = new Tv();
CaptionTv c = new CaptionTv();
이렇게 참조변수 타입과 인스턴스 타입이 일치하게 생성하여 사용 할 수도 있지만, 부모 타입의 참조변수로 자식타입의 인스턴스를 참조하도록 하는 것도 가능하다.
예를들어 Tv t = new CaptionTv();
와 같이 자식클래스의 인스턴스를 참조할 수 있다. 하지만 ~~CaptionTv c = new Tv();~~
이렇게 자식클래스의 참조변수로 조상클래스의 인스턴스를 참조할 수는 없다.
또 Tv t = new CaptionTv();
이렇게 생성한 참조변수는 사용할 수 있는 멤버의 개수가 달라진다.
자식클래스의 인스턴스를 참조하기는 했지만, 자식클래스의 인스턴스에서 정의된 멤버는 사용하지 못한다.
참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 의 개수보다 작거나 같아야 한다.
자식타입에서 부모타입으로 형변환하는 Up-casting에서는 형변환을 생략해도 되지만, 부모타입에서 자식타입으로 형변환 하는 Down-casting에서는 형변환을 명시해야한다.
예를들어
class Car{
// ...
}
class FireEngine extends Car{
// ...
}
class Ambulance extends Car{
// ...
}
(클래스간에 형제관계는 존재하지 않기 때문에 FireEngine
형과 Ambulance
형 사이에 형변환은 되지않는다.)