다형성(polymorphism)

다형성이란?

객체지향개념에서 다형성이란 여러가지 상태를 가질 수 있는 능력을 의미한다.

자바에서는 한 타입의 참조변수로 여러타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.

즉, 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한 것이다.

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형 사이에 형변환은 되지않는다.)