
1. 객체 형변환과 객체 배열
1-1. 객체 형변환
java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.
Parent parent = new Child();
왼쪽 항(Parent)과 오른쪽 항(Child)의 객체 유형이 서로 다른 경우, 두 유형이 서로 상속 관계에 있고 왼쪽 객체(Parent)가 오른쪽 객체(Child)의 상위 클래스인 경우에만 암묵적인 형변환이 일어난다.
하위 클래스에서 상위 클래스 유형으로 할당하는 것은 가능하나, 그 반대의 경우에는 명시적 형변환을 해야 한다.
-> 그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형변환하는 경우에는 할당되는 객체이 유형에 따라서 실행 오류가 발생할 수 있다.
1-2. 객체간의 암묵적 형변환

전부 다 가능한 케이스
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;
1-3. 암묵적 형변환과 메서드 오버라이드
1-4. 명시적 형변환
상속관계의 객체를 부모 형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있고, 객체가 상위클래스 형태로 형변환되더라도 override된 자신의 기능은 잃지 않는다.
하지만 추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해진다.
Unit u1 = new Army;
Unit u2 = new Navy;
Unit u3 = new Airforce;
u1.attack();
u2.attack();
u3.attack();
1-5. 명시적 형변환
부모 클래스의 객체를 자식 클래스 형태로 변환하는 것
형변환을 위해서는 다음과 같이 형변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass c = (ChildClass) parent;
1-6. 명시적 형변환의 조건
객체가 최초 생성될 때 자식 클래스 형태로 생성되고, 부모 형태로 암묵적 형변환이 된 상태를 다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능하다.
ChildClass c1 = new ChildClass
ParentClass p = c1;
ChildClass c2 = (ChildClass) p;
1-7. 명시적, 암묵적 형변환 가능 여부
- 명시적, 암묵적 형변환 가능
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;