Java/OOP

[OOP] 업캐스팅(Upcasting), 다운캐스팅(Downcasting)

JoonYong 2024. 1. 30. 02:35

 

Parent p = new Child(); //업캐스팅 -p는 Parent형.
Child c = (Child) p; //다운캐스팅! -p는 Child형.

 

  • 업캐스팅(upcasting)과 다운캐스팅(downcasting)은 객체 지향 프로그래밍에서 클래스의 상속과 관련된 개념이다.
  • 말 그대로  업캐스팅은 하위 클래스에서 상위 클래스로 형 변환하는 것을 의미한다
  • 다운캐스팅은 상위 클래스에서 하위 클래스로 형 변환을 하는것을 의미 한다.

업캐스팅 (Upcasting)

 

업캐스팅은 하위 클래스의 객체를 상위 클래스의 객체로 변환하는 것을 말합니다. 이 변환은 자동으로 이루어집니다. 

class Mammal {
    void walk() {
        System.out.println("Mammal is walking");
    }
}

class Cat extends Mammal {
    void meow() {
        System.out.println("Cat is meowing");
    }
}

public class Main {
    public static void main(String[] args) {
        Mammal mammal = new Cat();
        mammal.walk();
    }
}

 

위 코드에서 Mammal mammal = new Cat();는 업캐스팅의 예입니다. '고양이' 클래스의 인스턴스를 생성하지만, 이를 '포유류' 타입의 참조 변수로 참조하고 있습니다. 업캐스팅된 객체는 상위 클래스에서 정의된 메소드만 호출할 수 있습니다. 따라서 mammal.walk();는 정상적으로 동작하지만, mammal.meow();는 오류가 발생합니다.


다운캐스팅 (Downcasting)

 

다운캐스팅은 업캐스팅의 반대로, 상위 클래스의 객체를 하위 클래스의 객체로 변환하는 것을 말합니다. 이 변환은 명시적으로 해야 합니다.

public class Main {
    public static void main(String[] args) {
        Mammal mammal = new Cat();
        mammal.walk();
        
        Cat cat = (Cat) mammal;
        cat.meow();
    }
}
  • 위 코드에서 (Cat) mammal 부분이 다운캐스팅입니다. 업캐스팅된 'mammal' 객체를 다시 'Cat' 타입으로 다운캐스팅하고 있습니다.
  • 다운캐스팅은 업캐스팅의 반대 개념으로, 상위 클래스의 객체를 하위 클래스의 객체로 변환하는 것을 말합니다. 이 변환은 명시적으로 해야 합니다. 예를 들어, 위에서 업캐스팅한 '포유류' 객체를 다시 '고양이' 객체로 변환하려면 다음과 같이 다운캐스팅해야 합니다.
  • 다운캐스팅 후에는 원래 하위 클래스의 메소드를 모두 사용할 수 있습니다. 하지만 잘못된 다운캐스팅은 실행 시 오류를 발생시킬 수 있으니 주의해야 합니다. 예를 들어, '강아지' 객체를 '고양이'로 다운캐스팅하려고 하면 오류가 발생합니다.