템플릿과 일반화 프로그래밍 📏

안녕하세요! 두두코딩 입니다 ✋
오늘은 Effective C++ 항목 41에 대해 알아보겠습니다.

🖇 소스코드에 마우스를 올리고 copy 버튼을 누를 경우 더 쉽게 복사할 수 있습니다!

궁금한 점, 보안점 남겨주시면 성실히 답변하겠습니다. 😁
+ 감상평 댓글로 남겨주시면 힘이됩니다. 🙇

명시적 인터페이스와 암시적 인터페이스

명시적 인터페이스

객체 지향 프로그래밍의 세계를 움직이는 축을 나누자면, 명시적 인터페이스런타임 다형성이다.

class Widget {
  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);
  }
}

위 코드는 우리가 객체지향에서 일반적으로 사용하는 코드이다.

암시적 인터페이스

템플릿 일반화 프로그래밍의 세계에서는 명시적 인터페이스와 런타임 다형성이 존재하긴 하지만, 더 중요한 개념이 등장한다. 바로 암시적 인터페이스컴파일 다형성 이다.

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

위와 같이 소스코드가 작성되어질 경우 w에 대해서 어떻게 말할 수 있을까?

암시적 인터페이스 같은 경우, 어떤 소스코드를 참조 (즉, 함수의 시그니처 기반)하지 않고 유효표현식에 중점을 둔다는 점에서 명시적 인터페이스와 차이를 이룬다.

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

암시적 인터페이스의 특징은 표현식을 기반으로 하고 있다는 점이다. 표현식만 만족하면 되는데, if 구문에 들어가는 bool 타입을 맞추도록 하면 된다. 즉, “w.size() > 10 && w != someNastyWidget” 해당 값이 bool 타입을 만족시킬 수 있게 호환성을 제공하면 된다는 점이다. 구체적으로 인터페이스가 어떤식으로 구축되어져 있어야한다고 명시하지 않는다는 것이 큰 장점이라고 보면 된다.

조금 더 구체적으로 예를들어, size() 같은 경우 10이라는 int 값과 비교를 하고 있다. 그렇다고 해서 size() 인터페이스가 무조건 int를 반환해야되느냐 그건아니다. operator> 연산자를 재정의해 int 타입을 받아서 bool 타입으로 반환하게 만들기만 하면 된다.

암시적 인터페이스를 구현할 때 주의할 점은 어떤 템플릿 안에서 어떤 객체를 사용하려고 할 때 그 템플릿에서 요구하는 암시적 인터페이스를 그 객체가 지원하지 않을 경우 사용이 불가능하다는 점을 주의해야한다. ( 컴파일이 아예 안될 것.. )

To Sum up