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

Minsu._.Lighting·2023년 12월 11일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 이 바닥에서 활개를 치고 다니는 주인공은 암시적 인터페이스와 컴파일 타임 다형성! "

  • 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원한다!
  • 클래스의 경우, 인터페이스는 명시적이며 함수의 시그니처를 중심으로 구성되어 있다. 다형성은 프로그램 실행 중에 가상 함수를 통해 나타난다!
  • 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성된다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타난다!

💡 명시적 인터페이스와 런타임 다형성

class Widget
{
public:
	Widget();
    virtual ~Widget();
    virtual 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);
    }
}
  • 명시적 인터페이스와 런타임 다형성은 객체 지향 프로그래밍의 주축 이다!

📌 doProcessing 함수는 명시적 인터페이스와 런타임 다형성으로 이루어져있다.

  • 소스 코드에 명시적으로 드러나는 인터페이스를 명시적 인터페이스라고 한다!
    - w는 Widget 타입으로 선언되었기 때문에 w는 Widget 인터페이스를 지원해야 한다, Widget 인터페이스를 소스 코드에서 찾으면 이것이 어떤 형태인지 확인할 수 있으므로 명시적 인터페이스라고 할 수 있다!

  • Widget의 멤버 함수 중 몇개는 가상 함수이므로, 이 가상 함수에 대한 호출은 런타임 다형성에 의해 이루어진다!



💡 암시적 인터페이스와 컴파일 다형성

template<typename T>
void doProcessing(T& w)
{
	if(w.size() > 10 && w != someNastyWidget)
    {
    	T temp(w);
        temp.normalize();
        temp.swap(w);
    }
}
  • 암시적 인터페이스와 컴파일 다형성은 템플릿에서의 주인공 이다!

📌 doProcessing 템플릿은 암시적 인터페이스와 컴파일 다형성으로 이루어져있다.

  • 이 템플릿이 제대로 컴파일되려면 몇 개의 표현식이 '유효'해야 하는데 이 표현식들은 바로 T가 지원해야 하는 암시적 인터페이스 라는 것!
    - w가 지원해야 하는 인터페이스는 이 템플릿 안에서 w에 대해 실행되는 연산이 결정한다.
    (size, normalize, swap 함수 뿐 아니라 복사 생성자, 부등 비교를 위한 연산도 지원해야 한다)

  • 인스턴스화를 진행하는 함수 템플릿에 어떤 템플릿 매개변수가 들어가느냐에 따라 호출되는 함수가 달라지는데, 이것을 컴파일 타임 다형성 이라고 한다!
    - operator> 및 operator!= 함수와 같이 w가 수반되는 함수 호출이 일어날 때 해당 호출을 성공시키기 위해 템플릿의 인스턴스화가 일어난다, 이러한 인스턴스화가 일어나는 시점은 컴파일 도중이다.



💡 런타임 다형성과 컴파일 타임 다형성의 차이

  • 런타임 다형성은 프로그램 실행 중, 컴파일 타임 다형성은 컴파일 진행 중 일어 난다...
    - 함수 오버로드와 오버라이딩의 차이와 흡사하다.


💡 명시적 인터페이스와 암시적 인터페이스의 차이

📌 명시적 인터페이스는 대개 함수 시그니처로 이루어 진다.

virtual size_t size() const;

  • 함수 시그니처란?
    - 함수의 이름, 매개변수 타입, 반환 타입 등을 통틀어 부르는 용어

📌 암시적 인터페이스는 유효 표현식으로 이루어 진다.

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

이 때 T(w의 타입)에서 제공될 암시적 인터페이스에는 다음과 같은 제약이 걸린다!

  • 정수 계열의 값을 반환하고 이름이 size인 함수를 지원해야 한다.
  • T 타입의 객체 둘을 비교하는 operator!= 함수를 지원해야 한다.
  • 위의 제약만 갖춘다면 어떤 값을 내뱉든 if 조건식에 맞는 즉, bool값으로만 사용할 수 있다면 어떤 값이든 상관 없다.


profile
오코완~😤😤

0개의 댓글

관련 채용 정보