java 기본 유형의 데이터들 처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
서로다른 클래스유형으로부터나온 객체 참조변수간의 대입에는 일정규칙이있다.
Parent p = new Child();
왼쪽 항(Parent)과 오른쪽 항(Child)의 객체유형이 서로 다른 경우, 두 유형이 서로 상속관계에 있고 왼쪽 객체(Parent)가 오른쪽 객체(Child)의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.
하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나, 그 경우에는 명시적 형변환을 해야한다.
A a1 = new B();
A a2 = new X();
-------------------
A a3 = new Y();
A a4 = new C();
-------------------
B b1 = new C();
B x1 = new Y();
-------------------
C c = new C();
B b2 = c;
-------------------
Y y = new Y();
X x2 = new Y();
암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게 물려받은 기능만 사용하도록 제한한다.
그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능하고, 추가적으로 구현한 기능은 사용할 수 없다
주의할 점은 기능의 제한이지 기능의 변경은 아니라는 것.
상속관계의 객체를 부모 형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있고, 객체가 상위 클래스형태로 형변환 되더라 Override된 자신의 기능은 잃지 않는다.
Unit u1 = new Army();
Unit u2 = new Navy();
Unit u3 = new AirForce();
u1.attack();
u2.attack();
u3.attack();
하지만, 추가적으로 구현한 기능은 사용할 수 없게 되므로, 원래의 기능을 다시 사용할 수 있는 방법이 필요해 졌다.
부모 클래스의 객체를 자식 클래스 형태로 변환
하는 것
형변환을 위해서는 다음과 같이 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildCalss child = (ChildClass)parent;
객체가 최초 생성될때 자식클래스형태로 생성되고 부모형태로 암묵적 형변환이 된 상태를 다시 원래의 자식클래스 형태로 되돌릴 경우에만 가능하다.
CClass child1 = new CClass(); // 일반적
PClass parent1 = child1; // 암묵적
CClass child2 = (CClass)parent2; // 명시적 : 암묵적을 되돌리는것
-가능한 경우 : new 로 할당된 원본클래스로 되돌아 가는 경우에만 가능
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;