내가 C++에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve C++ 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다.

항목 41의 이야기를 어떻게 풀어 갈지, 감이 오지 않았다. 그 이것은 항목 41을 잘 이해하지 못했다는 것을 증명하기라도 하듯, 나는 책을 여러번 반복해서 읽을 수 밖에 없었다.

시작하기 앞서 한가지만 기억하자, 템플릿 프로그래밍은 모두 컴파일 타임에 결정 된다! 나머지는 그냥 읽기만 하자. 어찌 보면 이 한가지 기억은 Goto 같은 녀석이다.. ..(왜 컴파일 타임에 결정하느냐? 라고 하면 .. 별도로 템플릿 프로그래밍에 관련된 책을 구입하여 공부하는게 좋을듯 싶다)

템플릿 프로그램밍에서의 초석은 암시적 인터페이스와 컴파일 타임 다형성을 쌓아 올리는 일이다.(... 이해하기 위해서라고 이해하면 된다). 이것부터 시작하면 바로 어려우니, 친숙하고 이해했던 것들(?)을 다시 정리하는 차원에서 .. 비슷한 개념인 비슷한 개념인 명시적 인터페이스(explicit interface)와 런타임 다형성(runtime polymorphism)에 대해서 설명 하겠다.

C++ 에서 명시적 인터페이스란 말들을 듣고라면, 여러가지 의미가 있다. 예를 들어서, 클래스 인터페이스, 함수 인터페이스, 객체 인터페이스, .. 등등 새롭게 나올수 있는 인터페이스등 ..  헷갈리는게 오히려 정상이다. 이래서 컴퓨터 공부하는게 힘들다.. 무슨 용어인지도 모르면 이야기를 들어도 뇌에 들어오지 않으니 말이다.

사설이 길었다, 바로 정리 들어가자.

우선 명시적 인터페이스 부터...객체 지향 프로그램밍을 A 라는 객체가 A.size() 나 A.empty() ,A.operator() 등을 지원한다면, A 객체의 멤버 함수에는 size() empty() operator() 같은 함수들이 A 객체 클래스의 소스코드에 분명히 정의 되어 있을 것이다. 또한 어떤 타입을 매개변수로 어떤 타입을 반환하는 지도 말이다. 그렇기 때문에 w 에게 있어 size(), empty() operator() 는 w가 사용할수 있는 인터페이스라 말 할수 있다.(interface 의 사전적 의미는 의사소통, 대화, 공유영역,접전 쯤으로 이해하면 될것이다.) 즉 w는 empty(), operator() size()를 명시적으로 지원되는 인터페이스 이다!


그렇다면 런타임 다형성은 또 무엇인가?
런타임 다형성.. 이 말만 들어도 참 어렵다. 영어 Run Time 실행 시간, 다형성 한문일테니 한문을 써주는 센스가 있어야 겠다. 다형성[多形性] (많은 다, 형상 형, 모습 성) 이다!

다 풀이 하자면, 실행 시간에 많은 형상을 가진 모습을 뜻하는 것으로써 우리 객체 지향에선 이 런타임 다형성이 무엇을 뜻하는 것일까?
EXPLICITINTERFACE의 멤버 함수 중에, 몇몇개는 가상함수로 되어 있다. 이 가상 함수 호출은 런타임 다형성을 띠게 된다.(런타임 다형성은 쉽게 이해 할수 있으니 구글링 하면 된다)



자 그렇다면, 초석을 깔아 둔 명시적 인터페이스(explict interface)와 런타임 다형성(runtime polymorphism)에 대해서 이해 했다면, 바로! 암시적 인터페이스(implicit interface)와 컴파일 타임 다형성(compile-time polymorphism)에 대해서 이해해보자.

암시적 인터페이스 .. 명시적 인터페이스는 시력이 안좋은 나에게 껴서 예쁜 여자를 손쉽게 분간 할 수 있는 안경의 역활과 비슷하지만, 도수가 높은 안경을 끼고, 여자를 보면 다 이뻐 보이는 것 같은 개념이랄까? (.. 어찌보면 도수 높은 안경이 .. 더 좋다고 할 수 있겠다.)


예제 코드를 기준으로 설명을 하려 한다, 위의 코드와 별반 다르지 않다. 그 차이는 명시적으로 나와 있으니 분간 하도록...

자.. signet 의 T를 보자.. T.. 어째서 T는 정의도 없는데 컴파일이 되는가? 혹시 도수 높은 안경껴서 다 이쁜 여자로 보이는건 아닌가?(여기서 여자는 코드다; 또한 여자를 비하하는것도 아니다. 오해 없길 바란다). 그렇다 다 정상적인 코드로 컴파일러는 인식을 한다. 이때 T의 인터페이스에 size(), empty(), operator()가 있기만 하면 이쁜 여자로 보인다는 것이다.

이런 것을 암시적 인터페이스 라 할 수 있다.


그렇다면 컴파일 타임 다형성(compile-time polymorphism)은  런타임 다형성과 어떤 차이가 있나?
런타임 다형성은 .. 프로그램 실행 중에 일어나는 다형성이지만, 컴파일 타임 다형성은 컴파일러가 컴파일을 할 때, signet( A ); 를 명시적으로 표기 할 때, 템플릿으로 정한 부분이 EXPLICITINTERFACE 형으로 새롭게 만들어 진다! 만약 EXPLICITINTERFACE2 가 있다면 signet 에 EXPLICITINTERFACE2 를 넣었을 때 EXPLICITINTERFACE2에 맞게 새로운 함수가 생겨난다!


정말 신기하지 않는가? .. 나만 신기하지 뭐..  이처럼 위의 코드 처럼 template <typename T> 는 동일한 코드를 T형에 맞추어 컴파일 타임에 생성해 준다는 이야기 이다!!


끝으로 몇가지 이야기를 덧붙인다.
 template 예제소스에서 if( w.size() > 10 && w() ) 을 보면
1. w.size() 의 반환값이 operator > 를 호출한다.
2. 호출된 operator>는 매개변수 10을 받는다.
3. 2의 반환값이 operator&& 를 호출 한다.
4. operator&& 의 매개변수가 w() 의 반환값을 매개변수로 받는다.
5. 4의 반환값이 bool 형과 호환되는 형을 반환하면 .. 컴파일라는 이쁜 코드로 인식한다는 이야기이다.


이것만은 기억하자.
1. 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원한다.
2. 클래스는 인터페이스가 명시적이며, 프로그래램 실행중에 다형성이 나타난다.
3. 템플릿은 인터페이스가 암시적이며, 컴파일 과정중에 다형성이 나타난다.


관련 링크
http://ikpil.tistory.com/342 <-- Effective 2판 에서의 템플릿 언제 템플릿을 쓸 것인가?
http://kldp.org/node/58115 <-- 템플릿을 보다 더 자세하게 구현할수 있는 답변이 있다.
http://cooljy.tistory.com/tag/템플릿 <-- 템플릿 사용 방법에 대한 이야기
http://www.cplusplus.com/doc/tutorial/templates.html <-- 템플릿의 개념을 영문으로 설명해준다.
http://www.npteam.net/497 <-- 템플릿 기반의 싱글톤



more..







신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요