본문 바로가기
책 정리/Effective C++ 3rd

항목 41. 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터

by ocean20 2020. 3. 17.

1. 클래스의 특성

class Wdiget {
public :
  Widget();
  virtual ~Widget();
  virtual std::size_t size() const;
  virtual void normalize();
  void swap(Widget& other);
  …
};

void doProcessing(Widget& w)
{
  if (w.size() > 10 && w != someNastyWidget) {
    Widget temp(w);
    temp.normalize();
    temp.swap(w);
  }
}

 

*풀이

  1. w Widget 인터페이스를 제공해야된다. Widget 인터페이스가 소스코드에 명시되어 있다. -> 명시적 인터페이스

  2. Widget 가상함수는 실행도중 어떤것이 호출될지 결정된다. -> 런타임 다형성


2. 템플릿의 특성

- 컴파일타임다형성과 암시적인터페이스이다

 

template<typename T>
void doProcessing(T& w)
{
  if (w.size() > 10 && w != someNastyWidget) {
    T temp(w);
    temp.normalize();
    temp.swap(w);
  }
}

 

*풀이 : 클래스의 doProcessing()과의 차이점타입만 템플릿으로 변경하였다.

  1. 이제 T 함수들(swap(), normalize() , size() ) 지원해야하며, 복사생성자 부등비교 연산도 지원해야한다.

  2. 템플릿이 컴파일되기위해선 표현식이 유효해야 한다.(뒤에서 자세히 얘기해보자.), 이표현식들을 바로 T 지원해야 하는 인터페이스이다.

 

*풀이 : operator > 제대로 호출되려면 호출자가 있어야 한다. 따라서 w 인스턴스화 되어야하며, 인스턴스 과정은 컴파일타임에 발생한다. 인스턴스화를 진행하는 함수템플릿에 어떤 템플릿 매개변수가 들어가냐에 따라 지원하는 함수가 달라 진다. 어쨌든 모든과정을 컴파일 타입 다형성이라고 보면된다.

 

 


3. 런타임 다형성 VS 컴파일 타임 다형성

가상함수 호출의 동적 바인등을 런타임 다형성, 오버로드된 함수 호출할 것을 골라내는 과정을 컴파일 타임 다형성이라고 보면 되겠다.


4. 명시적 인터페이스

  - 암시적 인터페이스를 알아보기위해, 반대개념인 명시적 인터페이스를 다시봐보자

class Wdiget {
public :
  Widget();
  virtual ~Widget();
  virtual std::size_t size() const;
  virtual void normalize();
  void swap(Widget& other);
  …
};

*풀이 : 생성자, 소멸자 함수등에서 매개변수타입,반환타입이 명시적이다. -> 명시적 인터페이스


5. 암시적 인터페이스

  - 유효표현식으로 이루어져 있다고보면된다.

 

if (w.size() > 10 && w != someNastyWidget) {
…

 

*풀이 : w size() 함수를 지원해야하나, 상수를 반환할 필요는 없다. 만약, operator > 임의의 'X' 타입 객체와 int( ex. 10) 함께 호출된다면, size() X타입을 반환해주면된다. , T X 암시적인 변환이 가능해야한다.

 뭐가됐든 암시적인 변환만 가능하다면 OK

마지막으로 if( ) 문안에는 bool 값이 들어있어야 하므로 마지막으로 뱉어낸 값이 bool형과 호환가능하다면 문제 없다.

 

지금까지 템플릿의 특성(암시적 인터페이스와, 컴파일 타임 다형성) 살펴보았다.


이것만은 잊지 말자!

- 클래스 템플릿은 모두 인터페이스와 다형성을 제공한다.

- 클래스의 경우, 인터페이스는 명시적이며 시그너처(반환,매개변수) 중심으로 구성되어있다. 다형성은 런타임에 가상함수를 통해 나타난다.

- 템플릿의 경우, 인터페이스는 암시적이며 유효표현식을 기반으로 둔다. 다형성은 템플릿인스턴스화와 함수 오버로딩 과정(컴파일 타임)에서 나타난다.

댓글