AiPE

업 캐스팅(Up-casting) & 다운캐스팅(Down-casting)의 정의와 활용 예시 본문

[XiBBaL] Study/Java

업 캐스팅(Up-casting) & 다운캐스팅(Down-casting)의 정의와 활용 예시

Oshimaker XiBBaL 2024. 5. 4. 16:58
반응형

1. 캐스팅(Casting)의 정의

일반적으로 캐스팅(Casting)이란 명시적 형 변환과 동일한 용어로 쓰인다.

즉, 프로그래머가 (type) 연산자를 사용하여 의도적으로 자료의 형식을 바꿀 때 이를 특별히 캐스팅이라고 한다.

캐스팅은 업 캐스팅과 다운 캐스팅으로 나눌 수 있다.

 

(명시적 형 변환과 묵시적 형 변환에 대해서는 아래 포스팅 참조)

https://xibbal-lab.tistory.com/69

 

명시적 형 변환과 묵시적 형 변환

명시적 형 변환(Explicit Type Conversion)과 묵시적 형 변환(Implicit Type Conversion)은 데이터 유형을 다른 형식으로 변환할 때의 두 가지 방법이다. 정수 데이터를 소수(float)데이터로 변환하는 등, 데이터

xibbal-lab.tistory.com

 

따라서, 형 변환과 캐스팅 관련 용어를 관계도로 나타내보면 다음과 같다.

 

형 변환과 캐스팅의 관계

 

 

 

 

2. 업 캐스팅(Up-casting)의 정의

"업 캐스팅(Up-casting)"은 하위 클래스의 정보를 담을 수 있는 객체에 상위 클래스의 자료형을 부여해서, 상위 클래스처럼 사용하게 하는 것이다.

class Parent
     |
class Child

 

위와 같은 관계의 클래스가 있다고 했을  때, Child는 Parent 클래스를 상속받는다고 해 보자.

Parent p = new Child();

 

이 때, 업 캐스팅은 Parent형의 객체를 생성하고자 할 때, Child형의 정보를 좌변에 제공하는 것을 의미하게 된다.

 

상위 클래스인 좌변이 요구하는 정보는 하위 클래스인 우변은 당연히 전부 가지고있기 때문에 위 문장은 옳은 문장이 된다.

 

 

 

 

3. 다운캐스팅(Down-casting)의 정의

다운 캐스팅 (Down-casting)은 단순히 업 캐스팅의 반대말로 정의하지는 않는다.

 

"다운 캐스팅(Down-casting)"은 상위 클래스 타입으로 선언된 객체를 하위 클래스 타입으로 변환하는 것을 의미한다.

 

class Parent
     |
class Child

 

다시 위와 같은 상속관계가 있다고 했을 때,

Parent p = new Child(); // p는 Parent형
// 업캐스팅

Child c = (Child) p; // p는 Child형
// 다운캐스팅

 

위와 같이 업캐스팅 된 객체에 대해 다운캐스팅을 수행할 수 있다.

 

즉, 다운캐스팅이란 하위클래스의 정보를 담을 수 있는 객체의 자료형이 상위클래스로 전환되어 있던 것(=업캐스팅된 객체)을 다시 하위클래스의 정보를 담는 기능을 하도록  되돌리는 것을 의미한다.

 

다운 캐스팅은 상위 클래스로 선언된 객체를 실제로는 그 객체가 가지고 있는 하위 클래스의 메소드나 필드를 사용하기 위해 필요하다.

 

 

 

4. 다운 캐스팅(Down-casting)을 수행할 때의 주의점

업 캐스팅에서는 이러한 오류에 주의하지 않아도 되지만 다운캐스팅 시에는 ClassCastException 오류에 주의해야 한다.


다운 캐스팅은 실행 시에 타입 안전성을 보장하지 않는다.

 

즉, 다운 캐스팅하려는 객체가 실제로 해당 타입이 아닐 경우 ClassCastException이 발생할 수 있다.

따라서 반드시 instanceof 연산자를 사용하여 타입을 확인한 후에 다운 캐스팅을 시도해야 한다.

 

만약 Animal이라는 부모 클래스를 Dog라는 자녀 클래스가 상속받고 있다면, 다음과 같은 코드에서 ClassCastException 오류가 발생한다.

 

Animal a = new Animal();
Dog d = (Dog) a; // ClassCastException 발생!

 

 

요약하면, 다운 캐스팅은 상위 클래스로 선언된 객체를 하위 클래스 타입으로 변환하는 작업으로, 타입 캐스팅 시에는 반드시 타입 안전성을 고려하여 안전하게 다운 캐스팅을 수행해야 한다.

 

 

 

5. 다운캐스팅(Down-casting)의 활용

일반적으로 다운캐스팅은 다음과 같은 상황에서 활용된다.

 

 

① 상속 관계에서의 사용
다운 캐스팅은 주로 상속 관계에서 발생하기 때문에 하위 클래스가 상위 클래스 타입으로 선언된 객체를 참조하고 있을 때, 이 객체를 다시 하위 클래스 타입으로 변환하여 하위 클래스의 기능을 사용할 수 있다.

 

class Animal { ... }
class Dog extends Animal { ... }

Animal animal = new Dog();
// animal을 Dog 타입으로 다운 캐스팅
Dog dog = (Dog) animal;

 

 

② 실제 타입의 메소드 호출
상위 클래스로 선언된 객체는 실제로는 하위 클래스의 인스턴스일 수 있다. 다운 캐스팅을 통해 실제 타입의 메소드를 호출할 수 있게 된다.

 

Animal animal = new Dog();
if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark(); // Dog 클래스의 bark 메소드 호출
}

 

 

 

그렇다면 이러한 업 캐스팅과 다운 캐스팅을 왜 쓸까?

간단히 말하면 "다형성을 확보하기 위해서"라고 대답할 수 있을 것이다.

 

만약 어떠한 상위 클래스를 수많은 클래스들이 상속받는 복잡한 프로그램이 있다고 했을 때,

업/다운 캐스팅을 적극 활용하면 하나의 상위 클래스에만 메소드들을 잘 정의하면 그를 상속받는 모든 하위 클래스에서 이 메소드들을 오버로딩하여 활용할 수 있게 된다. 이에 따라 코드가 간결해지고, 다형성이 확보된다.

 

 

추가로, 아래 글이 캐스팅, 다운캐스팅, 업캐스팅에 대해 깔끔하게 정리해두었으니 더 궁금하면 읽어보자.

https://velog.io/@smallcherry/Java-UpCastingAndDownCasting

 

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

어떠한 자료형/클래스의 변수/객체를 만든다는 것은, 좌변의 자료형이 요구하는 정보를 모두 우변이 갖추었을 때 가능한 것이다.캐스팅은 형변환을 의미하는데 이 형변환 또한, 위에 맞춰서 생

velog.io

 

반응형