1. 클래스의 특성
class Wdiget {
public :
Widget();
virtual ~Widget();
virtual std::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);
}
}
*풀이
1. w는 Widget 인터페이스를 제공해야된다. Widget 인터페이스가 소스코드에 명시되어 있다. -> 명시적 인터페이스
2. Widget의 가상함수는 실행도중 어떤것이 호출될지 결정된다. -> 런타임 다형성
2. 템플릿의 특성
- 컴파일타임다형성과 암시적인터페이스이다.
template<typename T>
void doProcessing(T& w)
{
if (w.size() > 10 && w != someNastyWidget) {
T temp(w);
temp.normalize();
temp.swap(w);
}
}
*풀이 : 클래스의 doProcessing()과의 차이점은 타입만 템플릿으로 변경하였다.
1. 이제 T는 함수들(swap(), normalize() , size() )을 지원해야하며, 복사생성자 및 부등비교 연산도 지원해야한다.
2. 템플릿이 컴파일되기위해선 표현식이 유효해야 한다.(뒤에서 자세히 얘기해보자.), 이표현식들을 바로 T가 지원해야 하는 인터페이스이다.
*풀이 : 위 operator >가 제대로 호출되려면 호출자가 있어야 한다. 따라서 w는 인스턴스화 되어야하며, 이 인스턴스 과정은 컴파일타임에 발생한다. 인스턴스화를 진행하는 함수템플릿에 어떤 템플릿 매개변수가 들어가냐에 따라 지원하는 함수가 달라 진다. 어쨌든 이 모든과정을 컴파일 타입 다형성이라고 보면된다.
3. 런타임 다형성 VS 컴파일 타임 다형성
가상함수 호출의 동적 바인등을 런타임 다형성, 오버로드된 함수 중 호출할 것을 골라내는 과정을 컴파일 타임 다형성이라고 보면 되겠다.
4. 명시적 인터페이스
- 암시적 인터페이스를 알아보기위해, 반대개념인 명시적 인터페이스를 다시봐보자
class Wdiget {
public :
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize();
void swap(Widget& other);
…
};
*풀이 : 생성자, 소멸자 함수등에서 매개변수타입,반환타입이 명시적이다. -> 명시적 인터페이스
5. 암시적 인터페이스
- 유효표현식으로 이루어져 있다고보면된다.
if (w.size() > 10 && w != someNastyWidget) {
…
*풀이 : w는 size() 함수를 지원해야하나, 상수를 반환할 필요는 없다. 만약, operator >는 임의의 'X' 타입 객체와 int( ex. 10)이 함께 호출된다면, size()는 X타입을 반환해주면된다. 단, T는 X로 암시적인 변환이 가능해야한다.
뭐가됐든 암시적인 변환만 가능하다면 OK
마지막으로 if( … ) 문안에는 bool 값이 들어있어야 하므로 마지막으로 뱉어낸 값이 bool형과 호환가능하다면 문제 없다.
지금까지 템플릿의 특성(암시적 인터페이스와, 컴파일 타임 다형성) 을 살펴보았다.
이것만은 잊지 말자!
- 클래스 및 템플릿은 모두 인터페이스와 다형성을 제공한다.
- 클래스의 경우, 인터페이스는 명시적이며 시그너처(반환,매개변수) 중심으로 구성되어있다. 다형성은 런타임에 가상함수를 통해 나타난다.
- 템플릿의 경우, 인터페이스는 암시적이며 유효표현식을 기반으로 둔다. 다형성은 템플릿인스턴스화와 함수 오버로딩 과정(컴파일 타임)에서 나타난다.
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아두자 (0) | 2020.03.19 |
---|---|
항목 42. typename의 두 가지 의미를 제대로 파악하자 (0) | 2020.03.17 |
항목 40. 다중 상속은 심사숙고해서 사용하자 (0) | 2020.03.16 |
항목 39. private 상속은 심사숙고해서 구사하자 (0) | 2020.03.16 |
항목 38. "has-a(…는 …를 가짐)" 혹은 "is-implemented-in-terms-of(…는…를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자 (0) | 2020.03.12 |
댓글