항목 41 템플릿 프로그래밍은 암시적 인터페이스와 컴파일 타임 다형성부터
41.1 명시적 인터페이스와 런 타임 다형성
- 소스 코드에 명시적으로 드러나는 인터페이스를 명시적 인터페이스(explicit interface)라고 한다.
- 명시적 인터페이스는 함수의 시그니처(signature)로 구성된다.
- 함수의 시그니처란 함수의 이름, 매개변수 타입, 반환 타입을 통틀어 부르는 말이다.
- 가상 함수는 동적인 타입을 기반으로 프로그램이 실행되는 중, 즉 런 타임 다형성(runtime polymorphism)에 의해 호출된다.
class Widget
{
public:
Widget();
virtual ~Widget();
public:
virtual size_t size() const;
virtual void normalize();
void swap(Widget& other);
};
void DoSomething(Widget& widget)// Widget 인터페이스가 명시적으로 드러납니다.
{
if (widget.size() > 10 && widget != nastyWidget)
{
Widget temp(widget);
temp.normalize();// 이 메서드는 런 타임에 가상 함수 테이블을 참고하여 호출됩니다.
temp.swap(widget);
}
}
41.2 암시적 인터페이스와 컴파일 타임 다형성
- 암시적 인터페이스는 함수 시그니처로 구성되지 않는 인터페이스를 말한다.
- 암시적 인터페이스는 유효한 표현식으로 구성되어 있다.
- T는 컴파일되려면 size, normalize, swap 멤버 함수, 복사 생성자, 부등호 연산자 등이 T에 대해 유효해야 한다.
- T는 컴파일 타임(compile time) 다형성에 의해 템플릿이 인스턴스화되어 함수를 호출할 수 있는지 파악한다.
template<typename T>
void DoSomething(T& widget)// Widget 인터페이스가 더 이상 명시적이지 않습니다.
{
// 이 표현식은 컴파일 타임에 T에 대해 유효한지 파악합니다.
if (widget.size() > 10 && widget != nastyWidget)
{
T& temp(widget);
temp.normalize();
temp.swap(widget);
}
}
NOTE
① 클래스의 경우, 인터페이스는 명시적이고 함수 시그니처를 중심으로 구성된다. 다형성은 실행 중 가상 함수를 통해 나타난다.
② 템플릿의 경우, 인터페이스는 암시적이고 유효한 표현식을 중심으로 구성된다. 다형성은 컴파일 중 템플릿 인스턴스화와 함수 오버로딩을 통해 나타난다.
'Object Oriented Programming(C++) > Effective C++' 카테고리의 다른 글
Effective C++ | 항목 43 템플릿으로 만들어진 부모 클래스 안의 이름에 접근하는 방법을 알아두자 (0) | 2024.08.06 |
---|---|
Effective C++ | 항목 42 typename의 두 가지 의미를 제대로 파악하자 (0) | 2024.08.06 |
Effective C++ | 항목 40 다중 상속은 심사숙고해서 사용하자 (0) | 2024.08.06 |
Effective C++ | 항목 39 private 상속은 심사숙고해서 구사하자 (0) | 2024.08.06 |
Effective C++ | 항목 38 has-a 혹은 is-implemented-in-terms-of를 모형화할 때는 객체 합성을 사용하자 (0) | 2024.08.06 |
댓글