예전/C, C++

[C/C++] 다형성

showmiso 2012. 10. 15. 18:03


다형성 (Polymorphism)



다형성은

상위 클래스로 선언된 레퍼런스를 이용해, 하위 클래스 객체가 참조할 수 있는 것으로 확장성이 좋은 코드를 만들기 위해 사용됩니다.



다형성은 프로그래밍시 여러 곳에서 볼 수 있는데, 그 중에 하나는 오버로딩입니다.


오버로딩은 이름은 같으나, 기능은 다른 것입니다.

함수 오버로딩을 예로들면 하나의 함수 명으로 여러 작업을 동시에 할 수 있다는 특성이 다형성이라고 볼 수 있습니다.




다형성의 성질이 가장 잘 나타나는 곳은 상속입니다. 


여기서도 업캐스팅(Up-Casting)이 다형성을 가장 나타내는데, 업캐스팅이란 상위 클래스로 하위 클래스를 캐스팅하는 다형성의 핵심적인 부분입니다. 





위 코드에서 업캐스팅은 

ptr = new cBaby; 이 부분입니다.


부모 class 객체인 ptr에 자식 class를 할당하는 것으로, 부모 class 가 상위 이므로 자식 class를 담을 수 있습니다.



cBaby* ptptr = new cParent();



이 부분은 다운캐스팅 즉 부모를 자식에게 껴 맞추려는 것이므로 다음과 같은 에러가 발생합니다.




다운 캐스팅을 가능하게 하기 위해선 casting을 해줘야 하는데, 이는 추후 포스트 하겠습니다. ...





오버라이딩과 다형성



오버라이딩이란 상속 시 부모 클래스의 멤버 함수를 자식 클래스에서 재정의하는 것으로 반드시 virtual 키워드가 있어야 하며, 함수의 signature type이 같아야 합니다.



고양이 과를 예로 들어 봅시다. 고양이 과에 속하는 동물들은 여러가지가 있고, 그 중 대표적인 것이 호랑이와 고양이라고 합시다.


고양이 과 라는 부모 클래스 아래에

호랑이, 고양이 라는 자식 클래스가 있다고 표현할 수 있습니다.




모두 같은 고양이 과지만 서로 다른 점이 있을 것입니다. 예를 들면, 몸집이라던가 울음소리라던가 그런 것 말이죠.


하지만, 같은 고양이 과라고 하더라도 호랑이와 고양이는 차이가 있습니다.





여기서 울음소리라는 함수를 고양이, 호랑이 class가 오버라이딩한 것입니다.




(코드)


(결과)






고양이_과 class의 객체 냥이에게 고양이를 할당하면, 야옹을

호랑이를 할당하면, 어흥을 호출합니다.


이것이 바로 다형성 입니다.




만약 다형성을 사용하지 않으면, 모든 고양이과 동물의 울음 소리를 호출할 때,



고양이* 냥이 = new 고양이;

호랑이* 랑이 = new 호랑이;


...


냥이->울음소리();

랑이->울음소리();



이런 식으로 했을 것입니다. 



하지만, 다형성을 사용하면 


고양이_과 class를 사용해 모든 고양이과 동물의 울음 소리를 호출할 수 있습니다.