자료 저장소

# 템플릿(Template)

템플릿은 일종의 틀이다.
함수를 만들어 내는 템플릿은 '함수 템플릿'이라 불리고 클래스를 만들어 내는 템플릿은 '클래스 템플릿'이다.
템플릿은 다양한 자료형의 함수나 클래스를 만들어 낼 수 있으며 선언은 다음과 같다.

[덧셈 연산을 하는 템플릿]









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

template <typename T>
template <class T>

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

※ template <class T> 선언 또한 위의 문장과 같은 의미이다.


■ 함수 템플릿? 템플릿 함수?
int main() 
{
cout<<Add<int>(15,20) <<endl;
cout<<Add<double>(2.9,3.7) <<endl;
return0;
}
위에서 선언한 함수 템플릿을 기반으로 함수를 호출하기 위해서는 다음과 같이 함수를 호출하여야 한다.

Add<int>(15,20);

또는 일반 함수를 호출하듯이 호출할 수도 있다.

Add(15,20);

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

앞서 보인 템플릿의 정의를 가리켜 '함수 템플릿(function template)'이라 한다.
반면, 위의 템플릿을 기반으로 컴파일러가 만들어 내는 유형의 함수들을 가리켜 '템플릿 함수(template function)'
라 한다. 

[템플릿을 기반으로 만들어진 함수]
















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


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


















■ 함수 템플릿의 특수화(Specialization)

템플릿 함수의 구성방법에 예외를 둘 필요가 있을 때, 사용되는 것이 '함수 템플릿의 특수화'이다.





















위 코드에서 문자열 길이비교가 목적인 경우는 특별한 예외를 둬서 직접 함수를 작성하고 const char*형 템플릿
함수가 필요한 경우에는 별도로 만들지 말고 직접 작성한 코드를 사용해라'라는 의미이다.
template <> 
constchar* Max(constchar* a,constchar* b)
{
cout<<"char* Max<char*>(char* a,char* b)"<<endl;
return strlen(a) > strlen(b) ? a : b;
}
※ 위 코드에서는 T가 사용되지 않았기 때문에 T를 명시해주지 않았다.


# 클래스 템플릿(Class Template)

함수를 템플릿으로 정의했듯이 클래스도 템플릿으로 정의가 가능하며 이를 '클래스 템플릿'이라 한다.
또한 마찬가지로 이를 기반으로 컴파일러가 만들어 내는 클래스를 가리켜 '템플릿 클래스(template class)'라 한다.
























■ 클래스 템플릿의 선언과 정의의 분리
template <typename T> 
class SimpleTemplate
{
public :
T simpleFunc(const T& ref);
};

template <typename T>
T SimpleTemplate::simpleFunc(const T& ref)
{
...
}
※ 클래스 템플릿도 멤버함수를 클래스 외부에 정의하는 것이 가능하며, 이때는 클래스 템플릿의 정의와 함수의
정의가 완전히 별개이기 때문에 각각에 대해서 문자 T가 무엇을 의미하는지 설명해야 한다.


※ 클래스 템플릿의 선언과 정의부를 나눌때에는 되도록 헤더파일안에 정의 부를 포함시키도록 하자.

댓글 로드 중…

최근에 게시된 글