🔎 java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
🔎 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.
Parent parent = new Child();
왼쪽 항(parent)과 오른쪽 항(child)의 객체 유형이 서로 다른 경우, 두 유형이 서로 상속 관계에 있고 왼쪽 객체가 오른쪽 객체의 상위 클래스인 경우에만 암묵적인 형 변환이 일어난다.
하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는 명시적 형 변환을 해야한다.
🔎 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게 물려받은 기능만 사용하도록 제한한다.
🔎 그러므로 암묵적 형변환이 발생하게되면 오버라이드된 기능만 사용이 가능하고, 추가적으로 구현한 기능은 사용할 수 없다.
🔎 주의할 점은 기능의 제한이기 때문에 기능의 변경은 아니라는 것
🔎 상속관계의 객체를 부모 형태로 변환하면 클래스의
종류를 구분하지 않고 일관된 기능을 호출할 수 있다.
🔎 객체가 상위 클래스형태로 형변환 되더라도 Override된 자신의 기능은 잃지 않는다.
// 제한된 보기이기 때문에 기능이 사라지지는 않는다.//
Unit u1 = army; Unti u2 = navy; Unit u3 = airforce; u1.attack(); u2.attack(); u3.attack(); // 가능하다 -> 상속받음 + 부모에 존재하는 정의
-> 추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.
// 부모 클래스가 가지고 있는 기능이 아니므로 에러 발생 u1.tank(); u2.nucleus(); u3.bombing();
-> - instanceof 연산자를 통해 어떤 객체에 대한 출처를 판단하여 boolean형으로 결과를 반환한다.
-> 형변환이 가능해졌기에 다음 값을 읽어올 수 있다.
u1.tank(); u2.nucleus(); u3.bombing();
🔎 부모 클래스의 객체를 자식 클래스형태로 변환하는 것
🔎 형변환을 위해서는 다음과 같이 변환할 클래스이름을 명시적으로 지정해야 한다.
Child child = (Child)parent;
🔎 객체가 최초 생성될 때 자식 클래스 형태로 생성되고, 부모 형태로 암묵적 형변환이 된 상태를 다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능하다.
Ex)
1) ChildClass child1 = new ChildClass();
ParentClass parent1 = child1;
ChildClass child2 = (ChildClass)parent;
2) Army army1 = new Army();
unit u = army1; //암묵적 형변환
Army army2 = (Army)u; //명시적 형변환
3) Unit u = new Navy();
Navy navy = (Navy)u; //명시적 형변환
1) Unit u = new Unit();
Army army = (Army)u; //명시적 형변환 -> 불가
// 부모 형태로 암묵적 형변환이 된 상태를 다시 원래의
// 자식 클래스 형태로 되돌릴 경우에만 가능하다.
2) Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;
// 최초 생성된 것과 다른 형식으로 변환하는
// 것은 불가능하다.
-> <형변환이 불가능한 경우>
1), 2)는 문법적인 오류는 없기 때문에, 이클립스에서는 에러를 검출하지 못한다.하지만 프로그램을 실행시켰을 경우에는 에러가 발생