java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어 진다.
Parent parent = new Child();
/*-- 위의 표에서 암묵적 형변환이 어떻게 일어나는지 --*/
A a1 = new B(); // 암묵적 형변환 일어남
A a2 = new X(); // 암묵적 형변환 일어남
------------------
A a3 = new C(); // 암묵적 형변환 일어남
A a4 = new Y(); // 암묵적 형변환 일어남
------------------
B b1 = new C(); // 암묵적 형변환 일어남
X x1 = new Y(); // 암묵적 형변환 일어남
------------------
C c = new C();
B b2 = c; // 암묵적 형변환 일어남
------------------
Y y = new Y();
X x2 = y; // 암묵적 형변환 일어남
Unit u1 = new Army();
Unit u2 = new Navy();
Unit u3 = new AirForce();
// Army, Navy, AirForce 클래스는 Unit의 자식클래스들 이며,
// Unit 클래스의 attack() 메서드를 오버라이드 했음
u1.attack();
u2.attack();
u3.attack();
상속관계의 객체를 부모형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있다.
객체가 상위클래스형태로 형변환 되더라도 Override된 자신의 기능은 잃지 않는다.
하지만, 추가적으로 구현했던 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.
ChildClass child = (ChildClass)parent;
ChildClass child1 = new ChildClass();
ParentClass parent = child1; // 암묵적 형변환
ChildClass child2 = (ChildClass)parent;
Army army1 = new Army();
Unit u = army1;
Army army2 = (Army)u;
----------------------
Unit u = new Navy();
Navy navy = (Navy)u;
// 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다.
Unit u = new Unit();
Army army = (Army)u;
-------------------------------
// 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능 하다.
Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;