어제 오늘 내일

[Java] 클래스 형변환 (업캐스팅, 다운캐스팅) 본문

IT/Java

[Java] 클래스 형변환 (업캐스팅, 다운캐스팅)

hi.anna 2025. 12. 22. 07:51

 

Java에서 클래스 간의 형변환은 상속 관계가 있을 때만 가능합니다.
상속 관계에서는 부모 타입과 자식 타입 사이에서 자유롭게 변환이 가능하며, 이를 업캐스팅(Upcasting)다운캐스팅(Downcasting)이라고 부릅니다.
이 글에서는 두 개념의 차이와 사용법을 예제 중심으로 정리합니다.

 

1. 업캐스팅(Upcasting)

자식 타입 → 부모 타입으로 변환하는 것
업캐스팅은 가장 기본적인 형변환이며 자동 형변환됩니다.

class Parent {
    void hello() {
        System.out.println("Parent hello");
    }
}

class Child extends Parent {
    void bye() {
        System.out.println("Child bye");
    }
}

Parent p = new Child(); // 업캐스팅
p.hello();  // 부모 메서드 사용 가능

특징

  • 자식 객체이지만 부모 타입으로 취급됨
  • 부모가 가진 멤버만 사용할 수 있음
  • 자동 형변환 가능 (명시적 캐스팅 불필요)

주의

p.bye(); // ❌ 부모 타입에서는 호출 불가능

 

2. 다운캐스팅(Downcasting)

부모 타입 → 자식 타입으로 변환하는 것
업캐스팅의 반대이며 명시적 캐스팅이 반드시 필요합니다.

Parent p = new Child(); // 업캐스팅
Child c = (Child) p;    // 다운캐스팅
c.bye();                // 자식 메서드 사용 가능

특징

  • 반드시 업캐스팅된 객체만 다운캐스팅 가능
  • 자식 타입의 기능을 다시 사용해야 할 때 필요

 

3. 잘못된 다운캐스팅(주의!)

다운캐스팅은 “실제 생성된 객체가 자식 타입일 때만” 가능합니다.

Parent p = new Parent();
Child c = (Child) p; // ❌ 런타임 오류 (ClassCastException)

왜냐하면 p는 실제로 Parent 객체이며 Child 객체가 아니기 때문입니다.

 

4. 안전한 다운캐스팅: instanceof 사용

다운캐스팅 전에 instanceof로 실제 타입을 체크하면 안전하게 사용할 수 있습니다.

Parent p = new Child();

if (p instanceof Child) {
    Child c = (Child) p;
    c.bye();
}

장점

  • ClassCastException 방지
  • 다운캐스팅 전에 타입검사 가능

 

5. 전체 예제

class Parent {
    void hello() {
        System.out.println("Parent hello");
    }
}

class Child extends Parent {
    void hello() {
        System.out.println("Child hello");
    }

    void bye() {
        System.out.println("Child bye");
    }
}

public class Main {
    public static void main(String[] args) {

        Parent p = new Child(); // 업캐스팅
        p.hello();  // Child hello (오버라이딩)

        if (p instanceof Child) {
            Child c = (Child) p; // 다운캐스팅
            c.bye();             // 자식 메서드 사용
        }
    }
}

출력:

Child hello
Child bye

설명

  • 업캐스팅 후에도 오버라이딩된 메서드는 자식 메서드가 실행됨
  • 다운캐스팅을 통해 자식만의 기능도 사용 가능

 

6. 정리

업캐스팅(Upcasting)

  • 자식 → 부모
  • 자동 형변환
  • 부모 기능만 사용 가능

다운캐스팅(Downcasting)

  • 부모 → 자식
  • 명시적 형변환 필요
  • 실제 객체가 자식 타입일 때만 가능
  • instanceof로 안전하게 검사 가능

상속 관계에서 형변환은 다형성을 활용하는 핵심 개념이므로 반드시 이해해야 합니다.

 

 

반응형
Comments