삽질의 현장/- .NET

#031_닷넷(.NET)_.Net Framework 기본 - Up Cast & Down Cast

shovelman 2015. 10. 27. 18:44


안녕하세요 삽잡이입니다.


이번 시간에는 형식 변환인 cast에 대해서 알아보고자 합니다.


자식에서 부모로의 Up Casting은 자동으로 수행됩니다.

하지만, 부모에서 자식으로 Down Casting은 명시를 해줘야합니다.


이렇게 형식 변환이 되는 이유는 바로 '다형성' 때문입니다.

이 다형성은 '실 객체의 것이 호출되는 메커니즘'입니다.



구조를 한번 살펴볼까요?




Shape형 클래스를 Rect가 상속 받는 코드입니다.

따라서 Shape의 Draw() 메서드가 오버라이드 되서

Draw() 메서드의 것을 호출할 수 있지요...


Shape의 부모는 Object Class 아니겠습니까...

따라서 object에 자식인 Shape 형태의 객체를 담을 수도 있습니다.


오버라이드를 하지 않으면 부모의 것을 출력하지만

오버라이드를 하면 오버라이드를 한 자식의 것을 출력할 수 있습니다.

예를 들어보겠습니다.

object라는 부모에 virtual ToString() 메서드가 있다고 해봅시다.

그리고 Rect에도 ToString() 메서드가 있지요...

이때 obj.ToString() 메서드를 호출할 경우 오버라이드를 한 자식의 ToString()메서드가 호출됩니다.


object 는 최상위 부모입니다.

그런데 object에서 Draw()를 호출한다면, 

부모에서 자식의 메서드를 호출해는 것이니까 형변환을 해줘야합니다.


'((Shape)obj).Draw();'


원객체는 Rect이니 Rect의 Draw() 메시지가 호출됩니다.

다시 한번 말씀드리지만, '다형성'은 실 객체의 것이 호출되는 메커니즘입니다.

이것이 바로 override의 위력인 셈이지요...


위의 코드에서와 같이 'PrintWidth()' 메서드는 Rect에만 있는 메서드입니다.

따라서 Rect 형식만이 수행할 수 있기 때문에 

Rect로 다운 케스트를 해줘야하겠지요...

또 위에서 언급했지만, 

Down Cast는 자동으로 일어나지 않기 떄문에 명시적으로 표시를 해줘야합니다.


이것이 바로 'Rect는 Shape이다.' , 'Rect는 Shape이다.'가 성립한다는 것을 알려주는 것이고,

Object는 원래 Shape이였으면 shape으로,

원래 Rect 였으면 rect로 다운 케스트 할 수 있다 이겁니다...