본문 바로가기
NC University/Advanced C++

6일차 - CRTP (Curiosly Recurring Template Pattern)

by 날쑤 2015. 10. 30.

Intro

  아래 코드의 수행결과를 예상해보자.

  예전 글에서 Window 클래스의 멤버함수인 MessageLoop가 개념상으로는 아래 코드와 동일함을 언급했었다. 그리고 OnClick 함수는 비가상(non-virtual) 함수이기 때문에 MessageLoop 함수를 통해 호출되는 함수는 (2)가 아니라 (1)이다.

  원래의 의도대로 동작하게 하려면 가장 간단하게는 OnClick 함수를 가상함수로 선언하면 된다. 하지만 가상 함수를 사용하면 가상함수 테이블이 필요하며, 함수 호출시마다 추가적인 오버헤드가 발생한다. 가상함수 오버헤드 없이 이러한 문제를 해결하는데 CRTP는 좋은 해결책이 될 수 있다.

Curiosly Recurring Template Pattern

  CRTP는 파생(derived) 클래스가 자신을 타입 인자로 해서 인스턴스화한 기반(base) 템플릿 클래스를 상속받는 방식을 의미한다. 코드로 표현하면 대충 아래은 모양이 된다.

  이 패턴은 기반 클래스에서 이후에 만들어 질 파생 클래스의 타입을 활용할 수 있다는 특징을 가진다. 이를 이용하면 위의 문제를 가상함수 없이 간단히 해결할 수 있다. 아래 코드는 CRTP를 적용해서 Window와 MyWindow 클래스를 재정의해서 위의 문제를 해결하는 방법을 보여준다.

  마지막으로 이 패턴은 처음 코드에서 Base<derived> 클래스의 사이즈가 Derived에 대해 독립적으로 결정될 수 있을 때에만 유효하다. 또한, 기반 - 파생 클래스 간에 일반적인 다형적 동작이 요구될 경우에는 CRTP보다 가상 함수를 사용하는 것이 더 바람직하다.