[Effective C++] 41. 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타입 다형성부터
클래스의 특성
객체 지향 프로그래밍을 이루는 축은 명시적 인터페이스와 런타임 다형성이다.
class Widget
{
public:
Widget();
virtual ~Widget();
virtual size_t size() const;
virtual void normalize();
void swap(Widget& other);
};
void Func(Widget& w)
{
if(w.size() > 10)
{
Widget temp(w);
temp.normalize();
temp.swap(w);
}
}
명시적 인터페이스
Func 함수의 매개변수인 w는 Widget 클래스의 객체이므로 w는 Widget 인터페이스를 지원해야 한다. 이 인터페이스를 소스코드(Widget 클래스가 있는 헤더파일 등)에서 찾으면 확인 할 수 있으므로, 이런 인터페이스를 명시적 인터페이스라고 한다.
런타임 다형성
Widget의 멤버 함수 중 가상 함수가 있고, 이 가상 함수에 대한 호출은 런타임 다형성에 의해 이루어 진다.
특정한 함수에 대한 실제 호출은 w의 동적타입을 기반으로 프로그램 실행 중 런타임에 결정된다.
암시적 인터페이스와 컴파일 타임 다형성
템플릿과 일반화 프로그래밍을 이루는 축은 암시적 인터페이스와 컴파일 타임 다형성이다.
class Widget
{
public:
Widget();
virtual ~Widget();
virtual size_t size() const;
virtual void normalize();
void swap(Widget& other);
};
template<typename T>
void Func(T& w)
{
if (w.size() > 10)
{
T temp(w);
temp.normalize();
temp.swap(w);
}
}
암시적 인터페이스
Func 함수의 매개변수인 w가 지원해야 하는 인터페이스는 템플릿 안에서 w에 대해 실행되는 연산이 결정된다.
지금의 경우 size(), normalize(), swap() 멤버 함수를 지원해야 하는 w의 타입 T이다. 이 템플릿이 제대로 컴파일 되려면 몇개의 표현식이 유효해야 하는데 이 표현식들은 T가 지원해야하는 암시적 인터페이스이다.
컴파일 타임 다형성
매개변수 w가 수반되는 함수 호출이 일어날 때, 예를 들어 operator> 및 operator!= 함수가 호출 될 때는 해당 호출을 성공시키기 위해 템플릿의 인스턴스화가 일어난다. 이러한 인스턴스화가 일어나는 시점은 컴파일 도중이다. 인스턴스화를 진행 진행하는 함수 템플릿에 어떤 템플릿 매개변수가 들어가느냐에 따라 호출되는 함수가 달라지기 때문에, 이것을 컴파일 타임 다형성이라고 한다.
요약
- 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원한다.
- 클래스의 경우 인터페이스는 명시적이며 함수의 시그니처를 중심으로 구성되어 있다. 다형성은 프로그램 실행 중에 가상 함수를 통해 나타난다.
- 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성된다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타난다.
'Books > Effective C++' 카테고리의 다른 글
[Effective C++] 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자 (0) | 2022.07.08 |
---|---|
[Effective C++] 42. typename의 두 가지 의미를 제대로 파악하자 (0) | 2022.07.08 |
[Effective C++] 40. 다중 상속은 심사숙고해서 사용하자 (0) | 2022.07.03 |
[Effective C++] 39. private 상속은 심사숙고해서 구사하자 (0) | 2022.07.03 |
[Effective C++] 38. "has-a(..는..를 가짐)" 혹은 "is-implemented-in-terms-of(..는..를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자 (0) | 2022.07.03 |
댓글
이 글 공유하기
다른 글
-
[Effective C++] 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자
[Effective C++] 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자
2022.07.08 -
[Effective C++] 42. typename의 두 가지 의미를 제대로 파악하자
[Effective C++] 42. typename의 두 가지 의미를 제대로 파악하자
2022.07.08 -
[Effective C++] 40. 다중 상속은 심사숙고해서 사용하자
[Effective C++] 40. 다중 상속은 심사숙고해서 사용하자
2022.07.03 -
[Effective C++] 39. private 상속은 심사숙고해서 구사하자
[Effective C++] 39. private 상속은 심사숙고해서 구사하자
2022.07.03