#30. 클래스에 대한 정보를 프로그램상에서 활용하기

보통 클래스는 클래스 그 자체로서만 쓰였을 뿐 별도로 정보를 빼낸다든지, 클래스가 차지하는 메모리 점유율이라든지 하는 등의 어려운 내용들은 아주 알기가 어려웠었습니다. MFC 이전까지만 해도. 하지만, 지금 제가 알려드리는 이 팁은 당장은 아니어도 여러모로 나중에 큰 도움이 될 것입니다.


구조체중에 CRuntimeClass 라는 구조체를 알고 계십니까? 그런데 이상한 게 하나 있죠? 접두사가 분명히 C~ 인데, 왜 구조체냐구요? 실제로 MFC 헤더 선언을 찾아보시면 클래스가 아닌 구조체로 CRuntimeClass가 쓰여져 있습니다.


이 구조체는 CObject와 짝을 이루면서 같이 다니는 파트너라고 할 수 있습니다. 즉, CObject 그 자신은 물론이거니와 그 하위의 수많은 클래스들과 당연히 호환되겠지요.


이 CRuntimeClass가 담게되는 정보는 의외로 알기 어려운 정보들입니다. 실제로, 여러분이 프로그램 소스에서만 등장하는 클래스명을 런타임상에서 따로 빼내오기라는 것은 굉장히 골치아픈일일 겁니다. 하지만, 이 CRuntimeClass를 잘 활용하시면 비단 클래스명뿐만 아니라 클래스에 대한 실행중의 런타임 정보를 다 얻을 수 있습니다.


실제로 어떻게 CRuntimeClass를 사용할 수 있는지 예제를 한 번 봅시다. 이 예제 코드에서는, 현재 아래의 예제 코드가 입력된 위치의 클래스명을 얻어내는 기능을 합니다. 여기서의 프로젝트명은 Amazing이라고 합시다.



    CRuntimeClass* rtciInfo;


    rtciInfo = this->GetRuntimeClass();


    AfxMessageBox(rtciInfo->m_lpszClassName);


만약 위의 코드를 CAmazingView에서 입력했다고 가정합시다. 그러면, 여러분은 CAmazingView의 기능 어딘가에서 CAmazingView라는 내용을 출력하는 메시지 박스를 만날 수 있습니다.


또, 만약 위의 코드를 CAmazingDoc에서 입력했다고 가정합시다. 그러면, 여러분은 CAmazingDoc의 기능 어딘가에서 CAmazingDoc라는 내용을 출력하는 메시지 박스를 만날 수 있습니다.


어떻습니까? 단 세 라인만으로 쉽게 클래스 이름을 얻어내었습니다! 그리고 꼭 클래스명이 아니어도 다른 멤버 변수들을 보시면 좀 더 구체적인 정보들을 활용하실 수가 있습니다.

댓글 남기기