본문 바로가기

C/C++

[C++ 리플렉션] RuntimeClass 란...

RuntimeClass

 
 

[1]에서 퍼온 내용


최근에 Open Platform으로 갖춰야 할것 중 하나가 개발 툴인데,

IDE같은 개발 툴들은 대부분 Import, Plug-in, User Defined Control(ActiveX control) 등과 같이, System이 개발 된 당시에는 존제하지 않았던 class 나 객체들을 자연스럽게 설치추가하여 사용할 수 있도록 해주는 부분들이 매우 많은 범위에 존재한다.

이때 framework  구현부는 실제 class의 실체를 모른 상태에서 runtime시에 binding 되는 class의 객체를 생성해야 할 때가 있다.

 

class의 인스턴스 생성방법은 다들 알다시피 new를 통해 생성한다.

 

BaseClass * pInstance = new SubClass;

 

바꾸어 말하면 우리는 반드시 SubClass를 알고 있어야 한다는 것이다.

그래야만 instance를 생성 할 수 있다.

 

아래와 같이 CameraPlugIn class framework에서 모르는 상태라고 한다면 절대 instance를 만들 수 없다는 얘기죠.

 

IPlugIn * pPlugIn = new CameraPlugIn;

 

 

만약 우리가  CameraPlugIn를 모르는 상태 즉,  PlugIn Framework 개발당시에는 CameraPlugIn이라는 class를 모르는 상태에서  camera.dll또는 lib download받아서이를 link 또는 laod 해서 사용할 수 있는 기능을 제공하려 할때,

class를 모르는 상태에서 class  runtime시에 동적으로 search 하고 instance를 생성할 수 있도록 하는 기술이 필요하다.

 

이러한 기술을 리플렉션( Reflection) 이라한다.

 

C# 에서도 이와같은 리플렉션은 지원하고 있고, Runtime중에 type binding을 지원하는 Dyanimc 이라는 새로운 타입이 추가될 예정이라고 한다.

 

그외  루비스몰토크, PHP, 파이썬펄 등의 언어에서는 리플렉션 객체를 제공하며대부분 유사한 형태를 띄고 있다.

 

아쉽게도 C++ 에서는 공식적으로 지원하지 않는 기능이지만전세계의 수많은 똑똑한 개발자 분들이 이런 기능을 다양한 방법으로 제공하고 있다.

 

아마 MFC CRuntimeClass는 리플랙션과 비슷한 기능을 위해 만들어진 가벼운 Macro 정도이고 실제 훨씬 편리하고 플랙서블한 그런 library들도 많이 있으니 관심이 있다면 구글링으로 찾아보셔도 좋을 것입니다.


 보다 자세한 내용과 코드는 링크를 따라 가세요..

 http://spikez.tistory.com/55?srchid=BR1http://spikez.tistory.com/55

 

 

[2]에서 퍼온 내용 


CRuntimeClass란 단어의 뜻으로 감을 잡으셨겠지만..

특수(?)하게 쓰이고 있습니다...

 

보통의 Cwnd로 부터 상속된 크래스들은..

CWnd *pWnd = new CWnd;

pWnd->Create(...);

요렇게 하여 윈도우를 만들게 됩니다...

 

그런데...

CView로 부터 상속된 클래스들은 상황이 조금아니 많이 다릅니다..

CCreateContext context;

context.m_pNewViewClass = RUNTIME_CLASS(CMyView); <<-여기 (1)...

context.m_pCurrentDoc = RUNTIME_CLASS(CMyDoc);

...

CWnd *pWnd = (CWnd*)context.m_pNewViewClass->CreateObject(); <<- 여기 (2)...

ASSERT(pWnd->IsKindOf(RUNTIME_CLASS(CWnd))); <<- 여기도 사용..

pWnd->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rect, this, IDC_MY_VIEW, &context)

 

 

요렇게 하여 View윈도우를 만들게 됩니다 (MFC 내부에서 자동으로)... 또는 사용자가...

 

.. 그럼 볼까요..

(1) RUNTIME_CLASS(CMyView) marcro로서

CRuntimeClass* pClass = RUNTIME_CLASS(CObject); 요런뜻으로 쓰였구요..

(2) CRuntimeClass 구조체 내부의 CObject* CreateObject( ); 이 함수가 사용이 되었지요..

 

CRuntimeClass 를 사용하는 방법은...

.h 파일

class CPerson : public CObject

{

    DECLARE_DYNAMIC(CPerson) <<- 요렇게 DECLARE_DYNAMIC 라고 정의하고...

public:

    CPerson(){};

    // 다른 정의들을 추가 하여 넣고...

};

 

 

.cpp 파일

IMPLEMENT_DYNAMIC(CPerson, CObject) <<- 요렇게 IMPLEMENT_DYNAMIC 라고 정의하고...

 

어떤 함수 안에서

void SomeFunction(void)

{

CObject* pMyObject = new CPerson;

 

if(pMyObject->IsKindOf(RUNTIME_CLASS(CPerson))) <<- 요렇게 CRuntimeClass 를 사용합

니다..

{

//if IsKindOf is true, then cast is all right

CPerson* pmyPerson = (CPerson*) pMyObject ;

...

delete pmyPerson;

}

...

delete [MyObject];

 

 


 

출처

1. http://spikez.tistory.com/55?srchid=BR1http://spikez.tistory.com/55
2. http://joynsun.com/zboard/zboard.php?id=joy_note&no=295