|
뭐 빌더게시판이니까 빌더기준으로 설명 해 봅니다.
1. 예를들어... VCL 의 이벤트엔 호출측에서 Sender 가 날아오는데..
이 Sender 는 TObject 형식이죠.
그런데 이때 Button과 SpeedButton 과 다른 작업을 하고 싶다면 RTTI를 사용해서 구별 할 수 있겠죠.
다른경우라면 폼에 올려진 컴포넌트 를 검색할때 TComponent 의 List를 순회하게 되는데, 이중에서 Edit 만 전부 꺼버리고 싶다 할때... RTTI 를 이용할 수 있죠.
그리고 MFC는 CRunetimeClass가 RTTI 를 구현하는데.
이것의 목적은 "임의의 type" 의 객체를 생성하는데 있습니다. "type" 을 변수로 가질 수 있게 됨으로서, 런타임에 하나의 코드로 서로 다른 객체를 생성 할 수 있게 되는거죠..
그런데 왜 CRunetimeClass같은 클래스가 MFC에만 존재하냐면... MFC 첨 만들때는 C++에 RTTI가 없었거든요.
BEGIN_MESSAGE_MAP 은 메세지맵 매크로인데 RTTI와는 관계 없습니다.
또 다른 사용법이라면 시리얼라이즈에도 사용할 수 있습니다.(여기까지 지원하는 언어는 한정되어있지만)
Class의 필드 리스트를 Runtime 에 구할 수 있기때문에 코드를 수정하지 않고도 Class 의 정보를 한번에 정리할 수있죠.
사실 RTTI는 컴파일러에서 먼저 발전한 개념이 아닙니다..
스크립트에서 사용되던 기능이 편리하니까 컴파일러 언어쪽으로 넘어온거죠...
그러니까 RTTI 없다고 못만드는 프로그램은 없습니다.
단지 무지막지 귀찮아지는 경우가 생길 수 있죠,
2. 그냥 테이블에 클래스 정보 넣어둔것 뿐입니다.. 그 이상도 이하도 아니에요.
3. 그냥 통털어서 Run Time Type Information 일 뿐입니다.
용어이기도 하고 RTTI객체일수도 있고(MFC같은 경우) 언어의 기능일수도 있고 라이브러리의 기능일 수도 있죠.
질문 님이 쓰신 글 :
: RTTI에 대해 공부를 하였습니다
: RTTI가 실행중에 객체의 정보를 얻는 것을 말하는것 같은데
: 근데 이해가 안되는게 몇가지 있습니다
:
: 1. 왜 RTTI가 필요한가??
: -> 다형성 (같은 이름 다름 기능) 즉 virtual와 같은 가상함수를 자식 클래스에서 각각 재정의했을경우
: 그리고 부모 클래스에 자식클래스를 할당 했을 경우
: 즉) MainClass* main = new chaildClass; 이런식으로 선언을 했을 경우 RTTI를 사용해서 main이
: chaildClass의 객체라는 것을 알려주는 것인데...이게 왜 굳이 필요한건가요??
: 애초에 정의를 할 때 자식 클래스를 할당을 했는데 굳이 이것이 내가 맞게 자식 클래스를 할당했을지
: 단순히 확인을 위해 사용된다는데(인터넷 찾아보니 RTTI설명한 것중에 나와있었음) 단순히 이 이유만은 아닐 것
: 같아서요...
: 그런데 MFC 속성 창을 보니 런타임 형식 정보 사용을 예라고 설정되어 있더라구요 즉 이말은
: MFC에서는 RTTI를 사용하겠다는 소리이고.. RTTI를 사용하는 곳이 BEGIN_MESSAGE_MAP, END_MESSAGE_MAP 뭐
: 이런 define문에서 사용되는것 같은데 맞나요?? (RTTI 예제 중 define처리해서 표현한게 있길래 추측입니다)
: 그렇다면 왜 MFC에서는 RTTI를 어떤 경우에 왜 사용을 하는것인지 궁금합니다...
: 사용방법이나 예제 같은건 쉽게 구해서 공부를 했는데 정작 이것이 왜 필요한지 왜 사용되는지는 잘 설명이
: 되어 있질 않더라구요...
: 2. RTTI는 가상테이블에만 존재한다??
: -> 가상함수를 사용하는 클래스에 국한되어 사용되도록 되어 있으니 가상함수테이블에 RTTI가 저장되는건
: 이해가 갑니다 그런데 이 RTTI를 어떤식으로 호출하게되는건가요??
:
:
: 가상함수를 정의되어 있는 클래스를 b라고 객체선언을 했을 경우 메모리상에 가상테이블을
: 가리키는 포인터 값을 가지고 있고 이 포인터 값을 따라가면 가상함수테이블 해당 클래스가 가지고 있는
: 가상함수의 주소를 배열처럼 쭉 가지고 있는데 그럼 RTTI는 가상함수 주소값 처럼 RTTI주소값(?)이 가상함수
: 테이블에 나타나 있는건가요?? RTTI가 가상함수 테이블에 어떤 형태로 저장되어 있는지 궁금합니다...
: 3. 용어 정리
: -> RTTI가 실행중에 객체의 정보를 얻는 것을 말하는것이라는데 RTTI 자체가 어떤 건가요?
: 클래스 타입인건가요?? 아니면 그냥 용어인가요?? 아니면 객체(?)인가요??
: RTTI라는 새로운 개념에 대해 이것저것 알아가고 있는데 위의 질문에 대한 답은 잘 없네요...
: 3번 질문에 대해서 어떤 분이 언어의 기능, 혹은 컴파일러의 기능을 칭하는 명칭이라고도 하는데...이게 무슨뜻인지
: 이해가가질 안아서 같이 문의드립니다...
|