본문 바로가기

Library/Windows Programming

WTL을 사용할 때 주의할 점

Window Template Library(WTL)은 MFC에 비해 아주 작고 빠른 코드를 만들어 낼 수 있으며, 그 구조 또한 MFC와 비교되지 않을 정도로 깔끔하다. MFC 클래스들의 경우, CObject에서부터 개체를 상속 받기 때문에, CWnd에 이르러서는 엄청난 크기를 가진다. 즉, CWnd를 생성하는 것은 대단히 비싼 일이다. 반면, WTL은 interface / implementation이 엄격하게 분리된 구조로 설계되었다. CWnd에 해당하는 WTL의 CWindow은 사실 데이터멤버 밖에 가지고 있지 않으며, 크기가 매우 작다. 따라서, MFC처럼 CWnd 개체를 파라미터나 리턴값으로 사용하기 위해 상대적으로 TemporaryMap을 유지할 필요가 없으며, 이것은 MFC처럼 Idle 타임에 CWnd TemporaryMap을 청소할 필요가 없다는 것을 의미한다.

또, MFC에서 제공하는 PreTranslateMessage() 메서드는 대단히 유용하지만, 항상 필요한 것은 아니며, OnIdle() 역시 마찬가지이다. OnIdle()은 싱글 스레딩 환경에서는 유용한 도구지만, 지금의 멀티스레딩 환경에서는 그다지 필요하지 않다. 더구나, OnIdle()이 호출되는 시점에서 CWnd 개체 추적을 위한 CWnd TemporaryMap을 비우기도 해야 하므로 많은 일을 할 수 있는 것도 아니다. 만약, PreTranslateMessage() 기능이 필요하다면, CMessageLoop 클래스의 MessageFilter에 해당 윈도우를 등록하면 되고, IdleHandler가 필요하다면 역시 CMessageLoop의 IdleHandler에 해당 윈도우를 등록하면 된다. 이것은 리스트로 관리되기 때문에 MFC처럼 필요가 없다고 하더라도 모두 짊어지고 다닐 필요가 없다.

대단히 간결하고 세련된 설계의 WTL이지만, WTL에도 단점은 있는데, 가장 체감할만한 것은 역시 컴파일 속도이다. C++ 템플릿 기능을 사용하는데 있어, 특히 내포된 템플릿 코드를 컴파일하는 것은 그 속도가 대단히 느려질 수 있다. VC의 경우, 7.1 이상의 버전이라면 대단히 빠른 템플릿 처리 속도를 보여주지만, 보통의 C++ 코드를 컴파일하는 것에 비한다면 컴파일 시간이 확실히 더 오래 걸린다.