Template

Programming/C++ 2012. 10. 10. 00:20 |

함수 템플릿

- 함수 템플릿은 함수를 만들어 낸다. 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않아서 결정해야 한다.


함수 템플릿 이라는 것은 함수를 만드는 도구가 된다. 모형자가 모형을 만드는 도구가 되는 것처럼!! 그리고 모형자가 다양한 색의 모형을 만들어 내는 것처럼, 함수 템플릿도 다양한 자료형의 함수를 만들어 낼 수 있다.


int Add(int a, int b)

{

return a+b;

}


위에 정의한 함수의 자료형을 T로 대신할 수 있다. 


T Add(T a, T b)

{

return a+b;

}


int 형 자료형을 T로 대신했음을 알 수 있는데, 이는 자료형을 결정짓지 않은, 그래서 나중에 T를 대신해서 실제 자료형을 결정하겠다는 뜻이다.


그런데 이것이 전부가 아니다!! 컴파일러에게 다음과 같은 메시지를 전달해야 한다.


"T는 자료형을 결정짓지 않겠다는 의미로 사용한 것이다. 즉, 함수를 만들어 내는 템플릿을 정의하기 위해서 사용된 것이다."

이러한 메시지를 담아야만 함수 템플릿이 완성된다.


template <typename T>

T라는 이름을 이용해서 아래의 함수를 템플릿으로 정의한다는 의미이다.


※ typename 을 대신해서 class 를 사용할 수도 있다.

template <typename T> 선언을 대신해서 template <class T> 를 선언해도 똑같은 의미이다.

그리고, T라는 문자대신 다른 문자를 사용해도 된다.



14행에 Add<int>(15, 20); 라는 구문이 등장한다. 여기서 <int>가 의미하는 바는 "T를 int로 해서 만들어진 Add함수를 호출하라" 라는 의미가 된다.


위 예제에서 함수 템플릿을 기반으로 만들어진 함수는 이렇게 된다.


int Add<int>(int a, int b)

{

return a+b;

}


double Add<double>(double a, double b)

{

return a+b;

}


※ 함수 템플릿으로 한번 함수가 만들어지면, 그 다음에는 만들어진 함수를 호출할 뿐 새로 함수를 만들지는 않는다.

즉, 함수는 자료형당 하나씩만 만들어진다.


14행에서 주석이 설명하는 것처럼 함수 호출하듯이 Add(4, 3) 이렇게 써도 된다. 

왜냐하면, 전달하는 인자의 자료형을 참조하여 호출될 함수의 유형을 컴파일러가 결정하기 때문이다.


함수 템플릿 & 템플릿 함수


# 함수 템플릿


template <typename T>

T Add(T a, T b)

{

return a+b;

}


이것을 가리켜 "함수 템플릿(Function Template)" 이라 한다.

즉, 호출이 가능한 함수가 아닌, 템플릿임을 강조한 것이다.


함수 템플릿 => 함수를 만드는데 사용되는 템플릿




# 템플릿 함수


int Add<int>(int a, int b)

{

return a+b;

}


위의 템플릿을 기반으로 컴파일러가 만들어 내는 이런 유형의 함수들을 가리켜 "템플릿 함수(Template Function)" 이라 한다.

즉, 템플릿을 기반으로 만들어진, 호출이 가능한 함수임을 강조한 것이다.


템플릿 함수 => 템플릿을 기반으로 만들어진 함수


※ 템플릿 함수의 또 다른 표현

- 템플릿 함수는 컴파일러에 의해 성성된 함수이기 때문에 "생성된 함수(Generated Function)" 으로도 불린다.     

템플릿 클래스 역시 "생성된 클래스(Generated Class)" 라고도 불린다.





둘 이상의 형(type)에 대해 템플릿 선언하기


템플릿의 정의에도 다양한 자료형의 선언이 가능할 뿐만 아니라, 둘 이상의 형(type)에 대해서 템플릿을 선언할 수도 있다.



5행: 함수 템플릿의 매개변수 조차도 기본 지료형으로 선언될 수 있다.

7행: 인자로 전달된 num의 값을 T1과 T2로 명시되는 자료형으로 형 변환해서 출력하고 있다.

13~17행: 위의 함수 템플릿은 매개변수 형이 double로 선언되었기 때문에 전달되는 인자를 통해서는 T1과 T2의 자료형을 결정짓지 못한다. 따라서 이러한 경우에는 템플릿 함수의 호출형식을 완전히 갖춰서 호출해야 한다.


※ C++ 에서는 데이터에 소괄호를 묶는 형태로 형 변환을 명령할 수 있다.

ex) int num = (int)3.14;        =>        int num = int(3.14); 

이 두개의 문장은 완전히 일치한다.




template의 다른 예)






Posted by scii
: