본문 바로가기
Object Oriented Programming(C++)/Effective C++

Effective C++ | 항목 41 템플릿 프로그래밍은 암시적 인터페이스와 컴파일 시간 다형성부터

by continue96 2024. 8. 6.

Effective C++ 항목 41

 

항목 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
① 클래스의 경우, 인터페이스는 명시적이고 함수 시그니처를 중심으로 구성된다. 다형성은 실행 중 가상 함수를 통해 나타난다.
② 템플릿의 경우, 인터페이스는 암시적이고 유효한 표현식을 중심으로 구성된다. 다형성은 컴파일 중 템플릿 인스턴스화와 함수 오버로딩을 통해 나타난다.

댓글