casting
)이 이루어진다.
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 c = new C(); B b2 = c; ---------------------------------------- Y y = new Y(); X x2 = y;
- 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능하고, 추가적으로 구현한 기능은 사용할 수 없다.
- 객체가 상위 클래스 형태로 형변환되더라도
Override
된 자신의 기능은 잃지 않는다.- 상속관계의 객체를 부모 형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있다.
부모 클래스의 객체를 자식 클래스 형태로 변환하는 것이 명시적 형변환이다.
이를 위해서는 다음과 같이 변환할 클래스 이름을 명시적으로 지정해야 한다.
Child child = (Child)Parent;
명시적 형변환의 조건
- 객체가 최초 생성될 때 자식 클래스 형태로 생성되고, 부모 형태로 암묵적 형변환이 된 상태를 다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능하다.
예시
ChildClass child1 = new ChildClass(); ParentClass parent1 = child1; //암묵적 형변환 ChildClass child2 = (Childclass)parent1; //명시적 형변환
Army와 Navy가 각각 Unit을 상속할 경우
- 명시적 형변환이 가능한 경우의 예시
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; //최초 생성된 것과 다른 형식으로 변환하는 것은 불가능
Army[] data = new Army[3];
new
를 사용하여 객체를 할당해야 한다.data[0] = 1;
data[1] = 2;
data[2] = 10;
...
data[0] = new Army();
data[1] = new Army();
data[2] = new Army();
...
// Army, Navy, AirForce가 각각 Unit을 상속할 경우 Unit[] unit = new Unit[3]; Unit[0] = new Army(); Unit[1] = new Navy(); Unit[2] = new AirForce();
- 서로 다른 객체를 부모 형태의 배열에 담게 되면, 반복문으로 일괄처리가 가능하다.
- 이 때 배열의 각 요소를 통하여 사용하는 메서드가
Override
되어 있을 경우, 부모의 메서드가 아니라 자신이 재정의한 기능을 뜻한다.for( int i = 0; i<unit.length; i++){ unit[i].attack(); } // 부모 클래스에 attack()메소드가 존재하고 각 자식 클래스에서 오버라이딩되었을 경우, 반복문을 통해 배열에 포함된 자식 객체들의 attack()메소드를 일괄적으로 처리할 수 있다.