명시적 인터페이스(explicit interface) 란 소스코드 (header 파일 등) 에 선언된 Code를 보고 interface를 확인 할 수 있는 것을 가리키는 말이며, 런타임 다형성(runtime polymorphism) 이란 virtual로 선언된 가상 함수의 실제 호출은 동적 타임을 기반으로 프로그램 실행 중, 즉 런타임에 결정된다는 말이다.
템플릿과 일반화 프로그래밍의 세계는 뿌리부터 뭔가 다른 부분이 있다. 이 바닥에서 홀개를 치고 다니는 주인공은 암시적 인터페이스(inplicit interface)와 컴파일 타임 다형성(compile-time polymorphism)이다.
template<typename T> void doProcessing(T& w) { if (w.size() > 10 && w != someNastyWidget) { T temp(w); temp.normalize(); temp.swap(w); } }
위의 Code에서 모르긴 몰라도 T의 객체는 size(), normalize(), swap() 맴버 함수를 가져야 한다. 이 템플릿이 제대로 컴파일되려면 사용된 표현식들이 유효(valid)해야 하는데, 이 표현식들이 바로 T 가 지원해야 하는 암시적 인터페이스(inplicit interface)이다.
operator > 및 operator != 함수가 호출될 때 템플릿의 인스턴스화가 일어난다. 이것은 컴파일 도중에 일어난다. 인스턴스화를 진행하는 함수 템플릿에 어떤 템플릿 매개변수가 들어가느냐에 따라 호출되는 함수가 달라지기 때문에 이것을 컴파일 타임 다형성(compile-time polymorphism)이라 한다.
명시적 인터페이스(explicit interface)는 함수 시그너처로 이루어지지만, 암시적 인터페이스(inplicit interface)는 표현식(expression)으로 이루어진다. 위의 Code를 봤을때 T의 객체는 정수 계열의 값을 return 하는 size() 함수를 지원해야 하며 T 타입 객체 둘을 비교하는 operator != 함수를 지원해야 한다고 보여지지만 꼭 그런것은 아니다. 실제로는 연산자 오버로딩의 가능성도 있고, size()는 꼭 수치값을 return 할 필요도 없다. if 안의 문장전체의 처리 결과가 boolean 형식의 값으로 표현만 되면 유효하다.
* 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원합니다.
* 클래스의 경우, 인터에피스는 명시적이며 함수의 시그너처를 중심으로 구성되어 있습니다. 다형성은 프로그램 실행 중에 가상 함수를 통해 나타납니다.
* 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성됩니다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타납니다.
댓글 없음:
댓글 쓰기