|
안녕하세요.
typeid 연산자는 type_info 객체에 대한 참조를 리턴한다고 알고 있습니다. 그런데 이 타입정보 객체가 컴파일 시간에 만들어지는지 실행시간에 만들어지는지 알고 싶습니다. 예를 들어서,
class A { ... };
class B : A { ... };
class C : B { ... };
class D : C { ... };
A* GetOne();
int main()
{
A* pa = GetOne();
if(typeid(D)==typeid(*pa)) { ... }
return 0;
}
A* GetOne()
{
A* pa;
switch(rand()%3)
{
case 0: pa=new B();
case 1: pa=new C();
case 2: pa=new D();
}
return pa;
}
여기서, pa가 가리키는 객체는 분명 실행을 해 봐야 알 수 있습니다. 그런데 pa가 가리키는 객체가 무슨 타입인지를 알아내서 그것의 타입정보객체를 생성하는 것도 실행시간에 이루어지나요? 만일 그렇다면 pa가 가리키는 곳은 단순히 메모리덩어리일텐데 그것을 보고 어떻게 타입정보를 얻어낼 수 있나요?
혹시 컴파일시간에 이미 각 클래스별로 타입정보객체를 미리 생성해서 가지고 있는건 아닐까요?
================================================================
만일 컴파일 시간에 생성하는 것이 맞다고 가정했을때...
자바나 C#에는 reflection이라는 기능이 있는데요. 바로 실행시간에 객체 혹은 클래스의 타입정보를 얻는 기능입니다.
그러면, 왜 C++는 리플렉션이 없을까.. 생각해 봤는데요. 자바나 C#의 경우는 소스코드를 컴파일을 하게 되면 바이너리 코드가 아닌 중간단계의 또 다른 소스코드로 번역이 되는데요. 이 때문에 컴파일된 코드에서도 충분히 소스코드 수준의 정보를 얻을 수 있기 때문에 실행시간에 타입정보를 얻는 것이 가능한게 아닐까 생각했습니다.
하지만 C++의 경우는 바로 이진코드로 바뀌니깐 그것으로부터는 정보를 얻을 수가 없어서 리플렉션 기능이 없는 것이 아닌가 하구요..
================================================================
같은 맥락에서 생각해 보면 자바나 C#은 클래스의 선언이 따로 없습니다. 이 역시 클래스 정보를 컴파일된 코드로 부터 얻을 수 있기 때문에 굳이 필요 없는 것이 아닐까요?
C++는 컴파일되어 버리면 알 수 없기 때문에 헤더파일에 선언을 제공해야 하는거구요.
자바의 RAD툴 같은 경우 디자인할 때 컴포넌트의 정보를 리플렉션을 통해서 얻어낸다고 하더라구요. C++ Builder같은 경우는 헤더파일에서 컴포넌트의 정보를 제공하므로 이런 기능이 필요 없는 것이 아닐까요?
================================================================
감사합니다.
안녕히 계세요..
|