반응형
class Widget{
public:
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize();
void swap(Widget& other);
...
};
객체 지향 프로그래밍
void doSomething(Widget& w)
{
if(w.size() > 10 && w!=someNastyWidget){
Widget temp(w);
temp.normalize();
temp.swap(w);
}
};
Explicit interface(명시적 인터페이스)
인터페이스를 소스 코드에서 명시적으로 찾을 수 있는 경우를 의미한다.
대개 함수 시그니처로 이루어진다.
* 시그니처 : 함수의 이름, 매개변수 타입, 반환 타입 등을 통틀어 부르는 용어.
runtime polymorphism(런타임 다형성)
특정 함수에 대한 실제 호출이 동적타입으로 런타임에 결정되는 경우를 말한다.
템플릿, 일반화 프로그래밍
template<typename T>
void doSomething(T& w)
{
if(w.size() > 10 && w!=someNastyWidget){
T temp(w);
temp.normalize();
temp.swap(w);
}
};
implicit interface(암시적 인터페이스)
w의 타입인 T는 size, temp, normalize, swap 등의 멤버함수를 지원해야 한다.
또한, 실행되는 연산, 복사생성자 등도 지원해야 한다.
즉, 컴파일이 정상적으로 되기 위해 몇개의 표현식이 유효해야 하는데 이러한 표현식을 T가 지원해야 하는 암시적 인터페이스라고 한다.
함수 시그니처에 기반하고 있지 않고, 표현식(expression)으로 이루어진다. (표현식의 집합)
1. 정수 계열의 값을 반환, 이름이 size인 함수를 지원
T 타입의 객체와 int가 함께 호출될 수 있는 operator> 가 성립될 수 있음
매개변수는 T 타입일 필요는 없고 T타입으로 암시적 변환이 가능하면 ok.
2. T 타입의 객체 2개를 배교하는 operator!= 함수 지원
compile-time polymorphism(컴파일 타임 다형성)
함수의 호출을 하기 위해서 템플릿의 인스턴스화가 일어나야 한다.
인스턴스화는 컴파일 중에 발생하고, 함수 템플릿의 템플릿 매개변수에 따라 호출되는 함수가 달라지기 때문에 컴파일 다형성이라 부른다.
반응형
'Effective C++' 카테고리의 다른 글
이펙티브 C++ item 43 : 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아두자 (0) | 2022.07.08 |
---|---|
이펙티브 C++ item 42 : typename의 두 가지 의미를 제대로 파악하자. (0) | 2022.07.08 |
이펙티브 C++ item 39 : private 상속은 심사숙고해서 구사하자 (0) | 2022.07.03 |
이펙티브 C++ item 38 : "has-a" 혹은 "is implemented in terms of"를 모형화할 때는 객체 Composition을 사용하자 (0) | 2022.07.03 |
이펙티브 C++ item 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 (0) | 2022.07.03 |
댓글