객체 형변환과 객체 배열
java 기본유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(castring)이 이루어진다.
서로 다른 클래스 유형으로부터 나온 갹체 참조변수들 간의 대입에는 일정한 규칙이 있다.
Parent parent = new Child();
왼쪽항(parent)과 오른쪽(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 c1 = new C();
B b2 = c1;
-----------------
Y y = new Y();
X x2 = y;
Unit u1 = army;
Unit u2 = navy;
Unit u3 = ariforce;
u1.attack();
u2.attack();
u3.attack();
u1.tank(); //부모클래스가 가지고있는 기능이 아니므로 이하3개는 에러가 난다.
u2.nucleus();
u3.bombing();
추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.
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 = new army;
Navy navy = (Navy)u;
불가능한 두 가지의 경우 문법적인 오류는 없기 때문에, 이클립스에서는 에러를 검출하지 못한다.
하지만 프로그램을 실행시켰을 경우에는 에러가 발생한다.