한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현하였다.
조상클래스의 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
즉 조상의 리모콘으로 자손의 인스턴스에 관여할 수 있다는 말이다.
단 상속받은 인스턴스에만 접근이 가능하다.
반대로 자손의 타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다.
다음과 같은 관계의 클래스가 있다면
class Car {}
class FireEngine extends Car {}
class Ambulance extends Car {}
조상클래스 Car를
자손클래스 FireEngine 과 Ambulance가 상속받는다.
FireEngine fe = new FireEngine();
Car c = new Car();
FireEngine fe2 = null;
Car c = (Car)fe; //가능하다 조상타입으로 형변환 ( 리모컨만 조상타입으로 사용 (기능 > 버튼))
FireEngine fe2 = (FireEngine)c; // 빈 주소에 자손타입으로 형변환 위에서 참참조변수c에 fe의 주소를 가져왔기 떄문 즉( 기능 = 버튼개수 )
Ambulance a = (Ambulance)f; // 에러발생.. 서로 상속관계가 아니다.
위 관계를 도식화 한다면 다음과 같다.
형변환을 통해서 조상타입의 리모컨으로 자손타입의 인스턴스에 접근이 가능하나 조상타입의 맴버만 접근이 가능하다. 즉 이경우 c.water()는 사용이 불가능하다.
자바의 정석 연습문제 7-15
class Unit {}
class AirUnit extends Unit {}
class GroundUnit extends Unit {}
class Tank extends GroundUnit {}
class AirCraft extends AirUnit {}
Unit u = new GroundUnit();
Tank t = new Tank();
AirCraft ac = new AirCraft();
위 관계를 도식화 한다면 다음과 같다.
Unit u = new GriondUnit(); 즉 참조변수 u가 가지는 주소는 GroundUnit() 객체이다.
다음중 형변환이 틀린것을 고르시오. 🔑 정답 e
a. u = (Unit)ac;
b. u=ac;
c. GroundUnit gu = (GroundUnit)u;
d. AirUnit au = ac;
e. t = (Tank)u;
f. GroundUnit gu = t;