WinCNT

다형성(Subtype Polymorphism) 본문

게임 프로그래밍(학습 내용 정리)/C++

다형성(Subtype Polymorphism)

WinCNT_SSS 2021. 12. 16. 14:14

다형성을 쓰는 이유?

이동하는 개념은 같은데 실제로 수행하는 방법이 다르다

배열에다가 클래스의 포인터를 넣어서 수행을 했는데 실제로 수행하는 처리가 다르게 할 수 있음

 

메모리에서 부모를 new한 주소(포인터)나 자식와 new한 주소(포인터)는 같다

자식들은 부모의 포인터와 부모가 가진 변수 등의 가진 영역까지 같다

 

예를 들어 Draw()을 구현한다고 할 때...

다형성을 이용하면 같은 그리기 함수를 클래스별로 다르게 작동할 수 있다

 

다형적 동작을 하기 위해, 부모와 자식의 함수의 시그니쳐(함수의 모양)이 같다는 뜻이다

하지만 각각의 도형은 필요한 데이터(인자)가 다를 텐데...

예) 원 - 중점, 반지름, 사각형 - 네 점의 좌표

 

어떻게 해야 할까?

필요한 정보를 Information Class로 빼두고 거기를 참조하는 것도 한 가지 방법(디자인)

 

추상화(Abstraction)

다형성과 추상화캡슐화/은닉화의 관계와 비슷하다

 

참고) 캡슐화, 은닉화는 왜 쓰냐?!

우선 변수를 숨길 수 있다. 인터페이스를 쓰면 함수만 줄 수 있음

접근 제어와 그에 관련된 차이를 줄 수도 있다

 

서로 다른 클래스를 추상화해서 클래스로 만든 것

 

Virtual 키워드

부모의 Virtual Function은 파생 클래스에서 함수를 재정의 될 것을 기대되는 함수

자식의 Virtual Function은 재정의한 함수

(Virtual 클래스도 있지만, C++의 거의 최첨단 부분임)

 

당연히 가상 함수는 signature가 일치해야 함

 

버츄얼 펑션?하면 포인터가 생기는데 그게 어떠한 테이블?을 가르킴

버츄얼 펑션 포인터 - 재정의가 된 함수의 포인터가 기록된 테이블

 

 

정적 바인딩과 동적 바인딩

정적 바인딩

컴파일 시에 호출 함수를 결정함

일단적인 함수 호출

 

동적 바인딩

실행 시(Runtime)에 호출 함수를 결정함

부모의 객체의 4바이트의 Virtual 함수 포인터의 테이블이 있는 것

new로 객체를 만들 때, Virtal Function이 있으면 그 함수들을 동적으로 할당하고

함수의 포인터를 Virtual Function Table이라는 곳에 보관한다.

실제로 다형적 동작을 할 시에는 Virtual Function Table의 함수 포인터를 참고하여 동작한다

 

순수 가상 함수

추상적인 클래스

추상화를 하기 위한 전용 클래스

순수 가상 함수는 구현(객체화)를 안 되게 하려고 하기 위해 사용한다

(즉, new가 안 됨)

 

순수 가상 함수는 점점 Interface를 하는 쪽으로 발전한다

예를 들어 C#의 Inferface 클래스에서는 멤버 변수를 못 가지고 함수 구현을 못 하게 되어 있다

 

구현 상속

부모 클래스에서 객체의 구체적인 동작(data)만 상속받고

재사용할 수 있고 인터페이스는 물려받지 않는 상속을 의미한다

 

SSS

'게임 프로그래밍(학습 내용 정리) > C++' 카테고리의 다른 글

템플릿(Template)  (0) 2021.12.23
다중 상속과 RTTI(Runtime Type Information)  (0) 2021.12.17
상속  (0) 2021.12.14
동적 메모리 할당, 복사 생성자  (0) 2021.12.10
클래스(Class)  (0) 2021.12.09