[ 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);
}
}
소스 코드에 명시적으로 드러나는 인터페이스를 명시적 인터페이스라고 한다!
- 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);
}
}
이 템플릿이 제대로 컴파일되려면 몇 개의 표현식이 '유효'해야 하는데 이 표현식들은 바로 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!= 함수를 지원해야 한다.