어떤 기능,역활, 상태를 클래스에 부여하기 위해서, 상속이나 특성 클래스를 사용 한다. 이러한 클래스들에 제약을 두어서, 원하는 클래스만이 사용될 수 있게 하는 기술에 대한 이야기가 바로 항목 4이다. 이야기를 하기 위해서 5가지의 질문에 답해보고 생각해 보기 바란다고, 책에선 설명하고 있다.

1. 특성 클래스(traits class)의 정의는?

C++98 17.1.18에서, 클래스 템플릿과 함수 템플릿이 받아들이는 타입을 조작하기 위해, 필요한 타입과 함수의 집합을 포함하는 클래스라고 규정했다.

예를 들면,  iterator_traits 도 있고, not1에 넣을때 .. 몇몇 특성 클래스도 있고. 잘 사용하지 않아서 예는 잘 못들겠네;

2. 아래 클래스 템플릿이 있다. 템플릿 매개변수가 T* Clone( void ) const 을 포함하고 있을 때만, 컴파일 되게 하여라. 추가적으로 Clone()에 default 매개변수가 있어서 Clone() 호출이 되는것은 잘못된 것이라고 보고, 정확히 Clone(void) 이 있어야 한다.

아마도 이 질문에 답하기 위해선 몇가지 생각해 봐야 한다.

템플릿의 인스턴스화 때문에, 생성자와 소멸자에 체크하는 코드를 넣을 수 있지만, 둘 중 어디에 놓아야 할까?

생성자는 여러개가 있을 수 있고, 소멸자는 오로지 한개만 있을 수 있다. 그러므로, 소멸자에 놓는 것이 더 편하다고 생각 한다.


체크 코드는 어떻게 만들어야 할까?

이 문제의 답은 이미 Bjarne Stroustrup의 C++ Style and Technique FAQ에 나와 있으며, Alex Stepanov와 Jeremy Siek의 함수 포인터를 이용한 방법이다. 코드만 봐도 쉽게 파악 할수 있으니, 예제코드를 첨부 한다.

.. 소멸자에 넣어서 처리 할려고 했으니, 체크만 전담으로 하는 클래스를 만들어서 처리 하는 이 방법이 더 편하고 더 멋지다. ... 이것으로 질문 2의 답을 마친다.


3-1. 어떤 클래스 템플릿이 있다. 템플릿 매개변수가 Clone() 멤버 함수를 요구한다. 이 Clone 멤버 함수는 반드시 Cloneable이라는 베이스 클래스로 제공 되어져야 한다. 즉, 템플릿 매개변수 T는 Cloneable 클래스에서 제공된 Clone 멤버 함수를 가져야 한다는 것이다.

이 전제하에, 그 "어떤 클래스 템플릿"을 만들어라.

제일 먼저 해야 하는 것은, 아마도 T가 Cloneable를 상속했는지 체크하는 것이다. 2번 질문에서 static 함수를 이용하면, 다음 처럼 깔끔하게 만들수 있다.

3-2 3-1 상속되지 않았을 때, 디폴트 모드로 수행되게 만들어라. (이거 메타 프로그래밍이잖아!) 만들면서 생각한것은 Boost를 쓰겠다.


4. Clone()을 요구/감지 하는데 문제 3 방법이 최선인가?

.. 3에서 힘들게 구현해 놨더니, 더 좋은 방법을 4에서 설명해 주고 있다. .. 오늘 다시 한번 느끼는 것이지만, 문제를 정확하게 인식하는것이 문제를 정확하게 풀게 해주는 가장 빠른 지름길 같다.

다음 코드를 보고, 어떤 장점이 있는지 설명하겠다.

보면 알겠지만, MyCloneable 일 때만, 특화시켜서 해당 일을 처리하게 하고, 다를 경우에는 일반적인 Clone을 수행하게 한다. 보기도 간단하고 이해하기도 더 쉽다. 또한 특화시키는것도 간단하고, 더 다양한 것들을 포용할 수 있게 되었다.

... 읔


5. 특성 클래스를 이용한 기능 부여와, 상속을 통한 기능부여 중 무엇이 더 이득인가?

일반적으로 특성 클래스의 기능은 봐도 알겠지만, 상속 되는 녀석과 특성 클래스의 기능은 연관이 없다. 이런 녀석들을 상속하여 기능을 부여하게 된다면, .. 상속 계층이 더 꼬이게 되는 단점이 있다. 

그래서 특성 클래스를 이용한 방법이 더 확장성이 높고, 가독성이 좋다고 할 수 있겠다. 라고 책에 나와 있다.


총평

이번 항목은 메타프로그래밍도 어느정도 겸용하고 있다. .. 마침, 메타프로그래밍 공부도 겸용하고 있던 나에겐 시험의 대상였다. .. 특히 Boost 의 Type Traits 내부가 어떻게 이루어졌는지 짐작을 가능케 한다. : )

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기