다형성 (Polymorphism)
다형성은
상위 클래스로 선언된 레퍼런스를 이용해, 하위 클래스 객체가 참조할 수 있는 것으로 확장성이 좋은 코드를 만들기 위해 사용됩니다.
다형성은 프로그래밍시 여러 곳에서 볼 수 있는데, 그 중에 하나는 오버로딩입니다.
오버로딩은 이름은 같으나, 기능은 다른 것입니다.
함수 오버로딩을 예로들면 하나의 함수 명으로 여러 작업을 동시에 할 수 있다는 특성이 다형성이라고 볼 수 있습니다.
다형성의 성질이 가장 잘 나타나는 곳은 상속입니다.
여기서도 업캐스팅(Up-Casting)이 다형성을 가장 나타내는데, 업캐스팅이란 상위 클래스로 하위 클래스를 캐스팅하는 다형성의 핵심적인 부분입니다.
위 코드에서 업캐스팅은
ptr = new cBaby; 이 부분입니다.
부모 class 객체인 ptr에 자식 class를 할당하는 것으로, 부모 class 가 상위 이므로 자식 class를 담을 수 있습니다.
cBaby* ptptr = new cParent();
이 부분은 다운캐스팅 즉 부모를 자식에게 껴 맞추려는 것이므로 다음과 같은 에러가 발생합니다.
다운 캐스팅을 가능하게 하기 위해선 casting을 해줘야 하는데, 이는 추후 포스트 하겠습니다. ...
오버라이딩과 다형성
오버라이딩이란 상속 시 부모 클래스의 멤버 함수를 자식 클래스에서 재정의하는 것으로 반드시 virtual 키워드가 있어야 하며, 함수의 signature type이 같아야 합니다.
고양이 과를 예로 들어 봅시다. 고양이 과에 속하는 동물들은 여러가지가 있고, 그 중 대표적인 것이 호랑이와 고양이라고 합시다.
고양이 과 라는 부모 클래스 아래에
호랑이, 고양이 라는 자식 클래스가 있다고 표현할 수 있습니다.
모두 같은 고양이 과지만 서로 다른 점이 있을 것입니다. 예를 들면, 몸집이라던가 울음소리라던가 그런 것 말이죠.
하지만, 같은 고양이 과라고 하더라도 호랑이와 고양이는 차이가 있습니다.
여기서 울음소리라는 함수를 고양이, 호랑이 class가 오버라이딩한 것입니다.
(코드)
(결과)
고양이_과 class의 객체 냥이에게 고양이를 할당하면, 야옹을
호랑이를 할당하면, 어흥을 호출합니다.
이것이 바로 다형성 입니다.
만약 다형성을 사용하지 않으면, 모든 고양이과 동물의 울음 소리를 호출할 때,
고양이* 냥이 = new 고양이;
호랑이* 랑이 = new 호랑이;
...
냥이->울음소리();
랑이->울음소리();
이런 식으로 했을 것입니다.
하지만, 다형성을 사용하면
고양이_과 class를 사용해 모든 고양이과 동물의 울음 소리를 호출할 수 있습니다.
'예전 > C, C++' 카테고리의 다른 글
[C/C++] 변수 (지역, 전역, static, extern) (0) | 2012.10.16 |
---|---|
[C/C++] malloc/free 와 new/delete (0) | 2012.10.15 |
구현 해볼 것 (0) | 2012.09.16 |
[C++] 연산자 오버로딩 (3) | 2012.07.03 |
[C++] 생성자 소멸자 (0) | 2012.06.29 |