Java 다형성 - 캐스팅

상속 할당과 관련된 다운 캐스팅을 코드로 살펴보도록 한다.

생성한 코드와 경로

src
└Poly
    ├Parent.java
    ├Child.java
    └PolyMain.java

Parent.java

package poly;

public class Parent {

    void parentMethod() {
        System.out.println("This is Parent");
    }
}

Child.java

package poly;

public class Child extends Parent{
    void childMethod() {
        System.out.println("This is Child");
    }
}

PolyMain.java

package poly;

public class PolyMain {
    public static void main(String[] args) {
        // 자식 변수 생성
        // 생성한 자식 변수에게 인스턴스 참조
        System.out.println("== Parent To Child ==");

        Parent parent = new Child();
        System.out.println("======================");
        System.out.println();

        // 자식 클래스의 childMethod 를 호출할 수 없다.
        // parent.childMethod(); // 컴파일 오류

        System.out.println("== (Child) Parent To Child ==");
        // 다운 캐스팅 사용 (부모 타입 > 자식 타입)
        Child child = (Child) parent;
        child.childMethod();

        System.out.println("======================");
    }
}

실행결과

== Parent To Child ==
======================

== (Child) Parent ==
This is Child
======================

부모 변수에 자식 클래스 할당

Parent parent = new Child();
parent.childMethod(); // 컴파일 오류

parent 변수는 Parent 타입으로 초기화 되었다. Parent 타입은 호출한 메소드를 찾을 수 없어서 parent.childMethod() 코드를 호출할 수 없었다.

캐스팅

  • 업캐스팅 (upcasting): 부모 타입으로 변경
  • 다운캐스팅 (downcasting): 자식 타입으로 변경

다운 캐스팅

Parent parent = new Child();
Child child = (Child) parent;
child.childMethod()

새로운 Child 타입으로 child 생성하였다. parent 변수는 강제로 Child 클래스로 다운 캐스팅되어 child 에게 할당하여 child.childMethod() 코드를 호출할 수 있었다.

업 캐스팅

생성한 child 를 다시 Parent 클래스로 할당하고 싶은 경우, 캐스트 (..) 키워드를 사용하지 않고도 업 캐스팅을 할 수 있다.

Parent parent = new Child();
Child child = (Child) parent;
Parent p2 = child;
p2.parentMethod();