[JAVA] 업캐스팅과 다운캐스팅

[JAVA] 업캐스팅과 다운캐스팅

이전 글에서 다형성에 대해 정리하면서 부모 타입으로 자식 객체를 참조하는 예제를 많이 사용했습니다. 그때 자연스럽게 등장하는 개념이 바로 업캐스팅다운캐스팅입니다.

처음 이 용어를 봤을 때 저도 "형변환이랑 뭐가 다른 거지?"라는 생각이 들었고, 실제로 코드에서 많이 헷갈렸습니다. 그래서 이번 글에서는 개념 설명보다 코드와 출력 결과 위주로 정리해보려고 합니다.


1. 업캐스팅이란?

업캐스팅(Upcasting)은 자식 객체를 부모 타입으로 참조하는 것을 말합니다.

사실 다형성을 사용하고 있었다면, 이미 업캐스팅은 계속 사용하고 있었던 셈입니다.


class Animal {
    void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍");
    }

    void fetch() {
        System.out.println("공을 물어옵니다.");
    }
}

업캐스팅 예제 코드입니다.


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

        Animal animal = new Dog(); // 업캐스팅
        animal.sound();
    }
}

실행 결과 (Output)


멍멍

변수 타입은 Animal이지만, 실제 객체는 Dog이기 때문에 오버라이딩된 메서드가 실행됩니다.


2. 업캐스팅의 특징

업캐스팅에는 몇 가지 중요한 특징이 있습니다.

  • 형변환 연산자 없이 자동으로 변환된다
  • 부모 클래스에 선언된 메서드만 접근 가능하다
  • 다형성의 핵심 개념이다

예를 들어 Dog 클래스에만 있는 메서드는 바로 사용할 수 없습니다.


Animal animal = new Dog();
animal.fetch(); // 컴파일 에러

부모 타입으로 참조하고 있기 때문입니다.


3. 다운캐스팅이란?

다운캐스팅(Downcasting)은 부모 타입으로 참조하던 객체를 다시 자식 타입으로 변환하는 것을 말합니다.

다운캐스팅을 하면 자식 클래스의 메서드에 접근할 수 있습니다.


Animal animal = new Dog();
Dog dog = (Dog) animal; // 다운캐스팅

dog.fetch();

실행 결과 (Output)


공을 물어옵니다.

이렇게 다시 Dog 타입으로 변환했기 때문에 Dog 클래스의 메서드를 사용할 수 있습니다.


4. 다운캐스팅 시 주의할 점

다운캐스팅은 편리하지만, 아무 객체나 변환할 수 있는 것은 아닙니다.

아래 코드는 실행 시 에러가 발생합니다.


Animal animal = new Animal();
Dog dog = (Dog) animal; // 런타임 에러

이 코드는 컴파일은 되지만, 실행하면 ClassCastException이 발생합니다.

이유는 실제 객체가 Dog가 아니라 Animal이기 때문입니다.


5. instanceof로 안전하게 캐스팅하기

이런 문제를 방지하기 위해 instanceof 연산자를 사용합니다.


Animal animal = new Dog();

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.fetch();
}

실행 결과 (Output)


공을 물어옵니다.

실제 객체 타입을 확인한 후 캐스팅하기 때문에 안전하게 사용할 수 있습니다.


6. 정리

업캐스팅과 다운캐스팅은 다형성을 제대로 이해하기 위해 꼭 필요한 개념입니다.

  • 업캐스팅: 자식 → 부모 (자동 변환)
  • 다운캐스팅: 부모 → 자식 (명시적 변환)
  • 다운캐스팅 전에는 실제 객체 타입을 확인해야 한다

처음에는 헷갈릴 수 있지만, 직접 코드를 작성하고 출력 결과를 확인해보면 조금씩 감이 잡히는 것 같습니다.

다형성 → 업캐스팅 → 다운캐스팅 흐름으로 같이 정리해두면 나중에 다시 볼 때도 도움이 많이 될 것 같습니다.