C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[15693] RTTI에 대한 질문입니다.
궁그미 [zimzion] 784 읽음    2002-02-21 14:06
안녕하세요.

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같은 경우는 헤더파일에서 컴포넌트의 정보를 제공하므로 이런 기능이 필요 없는 것이 아닐까요?

================================================================

감사합니다.
안녕히 계세요..

+ -

관련 글 리스트
15693 RTTI에 대한 질문입니다. 궁그미 784 2002/02/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.