C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[389] 템플릿(template)의 개념 설명
홍환민.행복 [hhshhm] 11651 읽음    2003-04-21 20:10
[ 템플릿(template)의 개념 설명 ]

안녕하세요? 환민입니다.

모든 것이 그러하지만, 특히나 C++의 템플릿(template)을 이해하는데 있어서는
이론, 개념적인 측면에서 이해하는게 많은 도움이 됩니다.

그래서 이러한 측면에서 템플릿에 대해 설명을 드리려고 이 글을 씁니다.

일단 템플릿은 최근에 ANSI C++ 표준안에 포함된 C++의 언어적 기능입니다.

인자로서 특정한 데이터 타입을 넣어주면, 그 데이터 타입에 맞는 함수나 클래스를
자동으로 사용할 수 있게끔 해 줍니다. 편리한 기능이죠.

템플릿에 대해 모르시는 분을 위해, 예를 들어 봅시다.

1. 함수의 경우

template<class kind>
kind max(kind d1, kind d2)
{
  if (d1 > d2)
    return d1;
  else
    return d2;
}

void main(void)
{
  float f = max(3.5, 8.7);
  int   i = max(100, 800);
  char ch = max('A', 'Q');
  int  i2 = max(600, 200);
}

위의 template 함수의 정의를 보시면 함수 max의 각 인자 d1, d2와 리턴값의
데이터 타입이 kind 라고 되어 있습니다.
위의 템플릿 구문은 template<class kind> 라고 되어 있고요.

아래 main 함수에서 보시면 함수의 인자와 리턴값으로서 각각 float형, int형, char형을
사용합니다.

그래도 잘 작동을 합니다. 이게 바로 템플릿을 사용하므로서 가능해 지는 것입니다.

예전과 같았으면, max_float, max_integer, max_char과 같이 함수를 따로따로 만들거나,
'함수 오버로딩'을 이용해서 각각 데이터 타입에 맞는 함수들을 따로따로 작성해야 했을
것입니다. 템플릿은 이 것을 자동화해 줍니다.

이제 클래스의 경우를 알아보죠.
클래스에 사용된다는 것만 빼면 거의 비슷합니다.

2. 클래스의 경우

// 스택 알고리즘을 표한하는 클래스이다.
template<class kind>
class stack
{
  private:
    int count;       // 스택에 있는 항목 수
    kind data[100];  // 스택 내에 담길 항목을 위한 배열

  public:
    // stack을 초기화한다.
    stack(void)
    {
      count = 0;
    }

    // 스택에 항목을 넣는다.
    void push(const kind item)
    {
      data[count] = item;
      ++count;
    }

    // 스택에서 항목을 꺼낸다.
    kind pop(void)
    {
      --count;
      return data[count];
    }
};

이제 위 템플릿 클래스의 사용법입니다.

stack<int> int_stack;    // 정수 데이터 타입을 담을 수 있는 스택을 생성!
stack<float> float_stack;  // float 데이터 타입을 담을 수 있는 스택을 생성!

클래스를 생성할 때 < > 안에 데이터 타입을 넣어주면,
그 데이터 타입에 맞는 클래스를 생성해서 사용할 수 있게끔 해 줍니다.

쉽게 이해하자면, < > 안에 넣어진 데이터 타입을 위의 클래스 소스에서 kind 부분에
대치시키기만 하면 되죠.

자, 기본적인 템플릿이 무엇인가에 대한 설명을 한 듯 싶습니다.
이쯤해서 본격적인 얘기를 하도록 하죠.

그렇다면 C++ 컴파일러는 어떻게 위와 같은 것을 가능하게 할까요?
컴파일러 측면에서 템플릿은 어떤 것일까요?

이에 대한 해답은 '템플릿은 컴파일러 차원에서 데이터 타입에 따라 코드를 생성하는
기능' 이라는 것입니다.

코드를 생성한다는 말에 주목하세요.

위의 '1. 함수의 경우'에 있는 소스를 예를 들어 설명해 보겠습니다.

컴파일러가 컴파일을 시작합니다. 위에서 부터 아래로 소스를 분석해 나갑니다.

먼저 template 함수인 max가 보일 것입니다. 컴파일러는 이 max 함수를 생성될
바이너리 파일(생성될 코드)에 넣을까요?

일반적인 함수라면 그렇겠지만, 템플릿은 그렇지 않습니다!

컴파일러는 이러한 템플릿 함수가 있구나만 인식하고 실제 코드는 적지 않습니다.

그리고 계속 분석해 나갑니다.

그러다가 float f = max(3.5, 8.7); 라는 라인을 만나게 됩니다.

max 템플릿 함수를 쓰는데, float 데이터 타입을 이용해서 사용했구나! 라고 인지를
하고, 그에 맞는 함수의 코드를 직접 생성해 냅니다! 컴파일러가요...

예를 들면 다음과 같은 함수가 생성될 것입니다.

float max(float d1, float d2)
{
  if (d1 > d2)
    return d1;
  else
    return d2;
}

이렇게 실제로 프로그래머가 이런 소스를 작성한 것처럼, 컴파일러가 이런 코드를
생성해 냅니다.

다음 라인은 int 데이터 타입을 사용하는 함수를 만나게 되면, 마찬가지로 int 데이터
타입을 위한 함수를 생성해 냅니다.

다음의 char의 경우도 마찬가지고요.

그 다음에는 다시 int 데이터 타입을 사용하는 함수가 나타납니다. 이런 경우에는
이미 int 데이터 타입용 함수의 코드가 생성된 상태이므로 또 생성하지 않습니다.

템플릿 클래스의 경우도 마찬가지입니다.

이렇듯이! 마치 프로그래머가 일일이 해당 데이터 타입을 위한 소스 코드를 작성하듯이,
컴파일러가 자동으로 그러한 작업을 해주는 것이 템플릿 기능입니다.

컴파일러 측면에서 본다면, 템플릿은 기존에 없는 새로운 기법입니다.
그러므로 각 컴파일러 개발 업체는 템플릿이라는 새로운 C++ 문법을 구현해내야
했기 때문에, 많이 힘들었겠죠.

그래서, 템플릿을 구현한 초창기 C++ 컴파일러들에서는 버그가 많았습니다.
지금은 많이 나아졌지만요.

또한, 각 컴파일러 제작사마다 템플릿은 구현한 방법이 많이 틀립니다.
사용하는 입장에서는 똑같이 사용할 수 있지만, 그러한 컴파일러 간의 구현 방법의
차이로 인해 신경써 줘야 하는 부분들이 존재하며, 실제로 템플릿의 사용은
프로그램의 이식성을 떨어 뜨립니다.

현재는 이러한 문제점이 많이 개선되었으므로 사용할만 하며,
이러한 템플릿의 장점은 정말 뛰어나다고 할 수 있습니다.

이러한 템플릿을 이용한 가장 대표적인 라이브러리가
바로 표준적인 자료구조와 알고리즘을 구현한 STL (Standard Template Library)과
COM 객체를 구현할 때 사용하는 ATL (Active Template Library) 입니다.

STL과 ATL에 대해 찾아보시면 아시겠지만, 무지무지하게 각광받고 있는 대단한
라이브러리입니다. template의 우수성이 입증된 사례라고 볼 수 있죠.

STL과 ATL이 template을 사용함으로서 얻게 되는 장,단점은 관련 문서를 찾아보시면
잘 나와 있고요. 나중에 기회가 되면 적어보도록 하겠습니다.

일반적인 template의 장,단점을 설명드리자면,
템플릿이 생긴 이유와도 같은... '하나의 소스 코드로 다양한 데이터 타입에서
사용할 수 있다.' 라는 점입니다.
그리고 위에 설명드렸듯이 컴파일러 차원에서 코드를 생성해 주므로,
다른 방식에 비해 '속도가 뛰어나다' 입니다.
대강.. 이정도가 생각나네요.

단점이라면, '실행 파일이 커진다' 라는 점입니다. 각 데이터 타입에 따라 코드가
일일이 생성되기 때문에 당연히 커지겠죠.

또 하나의 단점이자 가장 큰 단점이라고 볼 수 있는게 '사용하기 어렵다'라는 것입니다.
실제로 STL의 경우 초보가 접근하기에는 많이 어려운게 사실입니다.

글이 많이 길어졌네요. 이만 줄이도록 하겠습니다.
행복하세요.


참고자료 )
C++ 프로그래밍의 이해(Practical C++ Programming)
한빛 미디어(O'REILLY) 출판.
Steve Oualline 저 (송호중 역).


+ -

관련 글 리스트
389 템플릿(template)의 개념 설명 홍환민.행복 11651 2003/04/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.