Home > 2024 > Java > ☕️[Java] 캐스팅의 종류

☕️[Java] 캐스팅의 종류
Java Programming Language

캐스팅의 종류

자식 타입의 기능을 사용하려면 다음과 같이 다운 캐스팅 결과를 변수에 담아두고 이후에 기능을 사용하면 됩니다.

Child child = (Child) poly
child.childMethod();

하지만 다운캐스팅 결과를 변수에 담아두는 과정은 번거롭습니다.
이런 과정 없이 일시적으로 다운캐스팅을 해서 인스턴스에 있는 하위 클래스의 기능을 바로 호출할 수 있습니다.

다음 코드를 봐봅시다.

일시적 다운 캐스팅

package poly.basic;

public class CastingMain2 {

  public static void main(String[] args) {
    // 부모 변수가 자식 인스턴스 참조(다형적 참조)
    Parent poly = new Child();

    // 단 자식의 기능은 호출할 수 없습니다.(컴파일 오류 발생)
    // poly.childMethod();

    // 일시적 다운캐스팅 - 해당 메서드를 호출하는 순간만 다운캐스팅
    ((Child) poly).childMethod();
  }
}

실행 결과

Child.childMethod

((Child) poly).childMethod()
  • polyParent 타입입니다. 그런데 이 코드를 실행하면 Parent 타입을 임시로 Child로 변경합니다.
    • 그리고 메서드를 호출할 때 Child 타입에서 찾아서 실행합니다.

정확히는 polyChild 타입으로 바뀌는 것은 아닙니다.

((Child) poly).childMethod(); // 다운캐스팅을 통해 부모타입을 자식 타입으로 변환 후 기능 호출
((Child) x001).childMethod(); // 참조값을 읽은 다음 자식 타입으로 다운캐스팅
  • 참고로 캐스팅을 한다고 해서 Parent poly의 타입이 변하는 것은 아닙니다.
    • 해당 참조값을 꺼내고 꺼낸 참조값이 Child 타입이 되는 것입니다.
      • 따라서 poly의 타입은 Parent로 그대로 유지됩니다.

이렇게 일시적 다운캐스팅을 사용하면 별도의 변수 없이 인스턴스의 자식 타입의 기능을 사용할 수 있습니다.

업캐스팅

다운캐스팅과 반대로 현재 타입을 부모 타입으로 변경하는 것을 업캐스팅이라고 합니다.

다음 코드를 봅시다.

package poly.basic;

public class CastingMain3 {

  public static void main(String[] args) {
    Child child = new Child();
    Parent parent1 = (Parent) child; // 업캐스팅은 생략 가능, 생략 권장.
    Parent parent2 = child;

    parent1.parentMethod();
    parent2.parentMethod();
  }
}

실행 결과

Parent.parentMethod
Parent.parentMethod

다음 코드를 봐봅시다

Parent parent1 = (Parent) child;
  • Child 타입을 Parent 타입에 대입해야 합니다.
    • 따라서 타입을 변환하는 캐스팅이 필요합니다.

그런데 부모 타입으로 변환하는 경우에는 다음과 같이 캐스팅 코드인 (타입)를 생략할 수 있습니다.

Parent parent2 = child
Parent parent2 = new Child()

“업캐스팅은 생략할 수 있습니다. 참고로 업캐스팅은 매우 자주 사용하기 때문에 생략을 권장합니다.”

  • 자바에서 부모는 자식을 담을 수 있습니다. 하지만 그 반대는 안됩니다.(꼭 필요하다면 다운캐스팅을 해야 합니다.)

업캐스팅을 생략해도 되고, 다운캐스팅은 왜 개발자가 직접 명시적으로 캐스팅을 해야할까요?