Post List

2015년 1월 4일 일요일

Template 프로그래밍의 천리길도 암시적 인터페이스와 컴파일 타임 다형성부터

 객체 지향 프로그래밍 (OOP)의 세계를 회전시키는 축은 명시적 인터페이스(explicit interface)와 런타임 다형성(runtime polymorphism) 이다.
 명시적 인터페이스(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 형식의 값으로 표현만 되면 유효하다.

 * 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원합니다.

 * 클래스의 경우, 인터에피스는 명시적이며 함수의 시그너처를 중심으로 구성되어 있습니다. 다형성은 프로그램 실행 중에 가상 함수를 통해 나타납니다.

 * 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성됩니다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타납니다.



댓글 없음:

댓글 쓰기