이번 항목[각주:1]은 RTTI 란 무엇인지에 대해서 살펴 본다. 


RTTI는 무엇인가?

 C++ 프로그래밍에선 Run-Time Type Information, or Run-Time Type Identification 약자로 "런타임 형식 정보" 기능을 뜻한다. RTTI 기능을 사용하기 위해선 컴파일러가 이 기능을 지원해야 하며, 비쥬얼 스트디오에선 프로젝트 속성이 "런타임 형식 정보 사용" 을 체크 해야만 한다.

이것은 클래스 및 함수, 기본자료 등 객체라 불리우는 모든 것에 컴파일러가 "아이디"를 부여하여, 기능이 구현되어졌다. 이 "아이디"는 type_info 객체[각주:2]로 구현 되어 졌으며, typeid 연산자를 통해서만, 생성 가능하다.[각주:3]


어떻게 typeid 를 사용 할수 있는가?

예제 코드


예제코드 분석

라인 38의 type_info 클래스 선언부분을 가져와 보자.

 코드를 보면, 기본 생성자는 없고, 복사 생성자와 복사 할당자가 private 영역에 있는 것을 확인 할수 있을 것이다. 이것으로 일개 프로그래머가 type_info 를 사용 할 수 없게 막았다는 것을 알 수 있다.

 또한 type_info 의 소멸자가 가상 소멸자로 되어 있는 것을 확인 할수 있을 것이다. 이것으로 typeid 연산자에 의해 생성된 객체는 type_info 클래스를 상속 받아 만들어 진 객체인 것을 확인 할 수 있다.

그래서 일부로 const type_info& 로 할당해 보았다.[각주:4] 부수적으로 typeid 는 const 참조형을 벹어 내기에 const 키워드를 붙여 줘야 한다.


그렇다면 이제, 우리에게 제공되어진 public: 인터페이스 각 함수들을 어떻게 사용 하는지 알아 보자.

name(), raw_name() 어떻게 사용 하고 무엇인가?

사용에 앞서 한가지 주의 해야 할 것은

  • 상속 관계에서 참조형에 대한 확인이 정확하게 되기 위해선 가상 함수가 꼭 있어야만 한다. 왜냐하면, 가상 테이블에 값이 있다면, 그것을 찾아가서 확인하기 때문이다.

name() 과, raw_name() 은 예제코드를 보면 알 수 있을 것이다. name() 은 우리 사람이 구별하기 위한 명칭을 char* 로 알려 주고 raw_name() 은 컴파일러가 구분하기 위해 사용하는 ID를 char* 로 아려준다.


그렇다면 before() 는 어떻게 사용 하는가?

위 코드에서 일부로 before를 빼었는데, 이것만 따로 예제코드를 제공 하겠다. 이 예제코드는 http://www.tenouk.com/cpluscodesnippet/viewtopic.php?p=382 에서 찾았으며, honeypot 님에 의해 작성되어진 것임을 미리 밝힌다.

코드에서 나와 있듯이, 기본 자료형은 char short int float double 순으로 정의 되어 있다. 출력 결과를 볼수 있듯이 알 수 있을 것이다. 또한 클래스 상속 관계에 따라 B 클래스는 A 클래스를 상속 되었는지를 확인할 수 있을 것이다.


operator== 과 operator!= 는 무엇인가?

type_info 객체의 비교 연산자이며 ==는 같은가? != 같지 않은가? 에 대한 비교를 하여 bool 형으로 반환 해 주는 연산자이다. 알다 시피 == 와 != 등의 연산자 구현시, 일반적인 상황에 맞추는게 제일 좋다.


총평




  1. Exceptional C++ 필 나게 이렇게 한번 해 봤다. ㅋ [본문으로]
  2. typeinfo 헤더에 클래스가 정의 되어 있다. [본문으로]
  3. 일개 프로그래머로썬 이 방법밖에 없다. [본문으로]
  4. 음~ 추론이 맞아 들었을 땐 참 기분이 좋다. [본문으로]
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요