무효 클릭 IP 추적 중...
c#

[c#] 업 캐스팅이란?

꼬예 2022. 5. 12.

업캐스팅을 영어로 표현해보면 up + casting으로 나눠 볼 수 있습니다.

 

여기서 casting은 무엇일까요?

아래 예제에 서로 다른 타입의 값들이 있습니다.

int a = 10;
double b = 3.14;

a = b //<--- 못함 타입이 다르기 때문

a = (int)b; // <--- 이런식으로 타입을 바꿔주는걸 casting이라고함

이때 한 값다른 값으로 할당을 할 수 없습니다. 왜냐하면 타입이 다르기 때문이죠.

이때 할당을 해주기 위해선 타입을 바꿔주는작업을 해야 하는데 이것을 casting이라고 합니다. 

 

up부모 클래스 타입을 의미합니다. 

업캐스팅이란 부모 클래스 타입으로 변경해준다는 의미인거죠.

 

아마 아직까지는 추상적으로 느껴져 이해가 안될것이니, 예시를 통해 확인해보겠습니다. 

 

1. 업캐스팅 기본구조

현재 구성된 코드는 Animal이라는 부모 클래스Dog라는 자식(파생)클래스가 준비되어 있습니다. 

 

 

Dog 클래스를 부모 클래스인 Animal타입으로 바꿔 볼까요?

 

방법은 여러가지가 있는데요.

 

1) 명시적인 형변환

Dog dog = new Dog();
Animal a = (Animal)dog; // 명시적으로 형변환을 해줄수도 있고

명시적으로 (Animal)를 통해 형변환을 해줄 수도 있습니다.

 

2) 묵시적인 형변환

Dog dog = new Dog();
Animal a = dog;

또는 그냥 할당을 하기만해도 자동적으로 형변환이 일어납니다.

 

 

3) 다이렉트 형변환

Animal animal = new Dog();

다 귀찮다 싶으면 객체를 다이렉트로 넣어도 됩니다. 

 

 

 

 

 

이러한 업캐스팅은 당연히 함수의 인자로 집어 넣을때도 같은 원리가 적용 됩니다.

 

2. 함수 인자로 넣을때 업캐스팅

 

아래와 같은 동물병원이라는 클래스를 하나 만들어 보았습니다.

매개변수 인자로는 위에서 정의한 부모 클래스인 Animal객체를 받도록 세팅이 되어있네요.

class 동물병원
{
    public void 진료(Animal animal)
    {
        Console.WriteLine($"{animal.Name} 도착");
    }
    
    
동물병원 Hospital = new 동물병원();
Hospital.진료(new Dog());

 

그런데 해당 인자로 Animal 이 아닌 Dog를 넣게 됩니다. [ Hospital.진료(new Dog());  ]

무슨일이 일어날까요?

 

앞서 배웠던대로 모습은 조금다르지만, 내부적으로 아래와 같은 작업을 하게 됩니다.

 

인자로 넣으면서 자동 업캐스팅이 되는것이죠.

 

 

3. 업캐스팅을 하면 정말로 타입이 바뀔까?

앞서 업캐스팅을 하면 부모클래스의 타입으로 바뀐다고 하였는데 정말 그럴까요?

 

Animal animal = new Dog();
Console.WriteLine(animal.GetType());

Output:

 

하지만 결과는 여전히 Dog입니다.

 

무슨일이 일어난걸까요?

 

사실 업캐스팅을 한다고 해도 그 타입자체가 변경되는건 아닙니다. 

다만 바라보는 위치(참조)가 바뀐것일 뿐입니다. 

 

그렇기 때문에 타입변경은 안되었으나, 부모 클래스의 기능들을 쓸 수 있고, 자식 클래스에서 정의한 필드나 메소드는 더이상 쓸 수 없는 것입니다.

(업캐스팅이 된 이후 기존 Dog에서 가지고 있던 bark를 쓸수 없는 상황)

 

 

이 글과 읽으면 좋은글

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글