본문 바로가기

예전/C, C++

[C++] 템플릿 ( Template ) - 함수 템플릿과 클래스 템플릿


템플릿



오버로딩을 활용하기 위한 것으로 기능은 결정되어 있으나 자료형이 정해지지 않은 것이다.


템플릿이란 말 그대로 무엇을 만들기위해 찍어내는 이다.


템플릿은 크게 함수 템플릿클래스 템플릿으로 나눌 수 있다.

함수 템플릿은 간단히 말하면 함수를 찍어내는 틀을 말하고, 클래스 템플릿은 클래스를 찍어내는 틀을 말한다.



1-1. 함수 템플릿


위에서 말했듯이 함수를 만드는 도구이다.

함수를 선언할 때 처리할 데이터의 자료형이 정해지지 않은 것으로 함수의 기능만 결정되어진 것이다. 

컴파일시 사용한 데이터 타입으로 함수가 만들어진다. 그렇게 만들어 진 것이 템플릿 함수이다.


예를 보자.



위는 스왑 함수에 대한 함수 템플릿이다.


T는 자료형이 오는 자리이다. 위치에 int도 올 수 있고, float도 올 수 있으며, class나 struct 같은 사용자 정의 자료형도 올 수 있다.


만약 int 형이 들어간다면 아래와 같이 된다.



1-2. 템플릿 함수



위는 1-1. 함수템플릿에 int라는 자료형을 넣어 만들어진 템플릿 함수 이다.


템플릿 함수란 함수 템플릿 즉, 함수 틀로 만들어진 함수 ( 템플릿을 통해 만들어진 함수 ) 로 실제 눈으로 보이진 않지만, 컴퓨터는 컴파일러시 저렇게 인식하고 있다.


컴파일시 생성된다고 말했다. 

ctrl + Alt + F7 을 눌러 재 빌드를 하고, obj (object) 파일을 txt 파일로 읽어보자.

main 에서 Swap 함수를 3 번 불렀다면, obj 파일에도 Swap함수가 3번 적혀있을 것이다. 

함수 템플릿을 사용해 템플릿 함수를 만드는 방법은

메인에서 함수를 그냥 사용하면된다.



주석 위 처럼 <int>라고 명시해줘도 되지만 

주석 아래처럼 명시하지 않아도 자료형이 int라고 인식한다.


만약 템플릿 화를 T1,T2로 하여 두 자료형이 서로 다르다면 자료형을 반드시 명시해줘야한다.





2-1. 클래스 템플릿


이제 클래스 템플릿이 무엇인지 알 것이다. 바로 클래스 를 만들어내는 틀! 이다.


클래스 템플릿도 함수 템플릿과 마찬가지로 컴파일시 템플릿 인자로 넘어온 자료형을 적용하여 새로운 클래스를 하나 생성한다. 그렇게 만들어진 클래스가 템플릿 클래스 이다.


클래스 템플릿 사용 시 하나의 헤더파일안에 함수의 구현과 선언부분을 모두 써줘야한다. 템플릿화 되지 않은 함수도 헤더 파일 안에 써줘야한다. 그렇지 않으면 링크시 구현부분을 찾지못해 Error가 발생한다. 

새 클래스 생성시 .cpp파일에 생기는 생성자와 소멸자의 정의 부분도 지워주어야 제대로 컴파일 되는 것을 확인할 수 있을 것이다.




위는 클래스 템플릿 사용법을 포스트 하기위해 필자가 만든 DoubleList Templating 의 헤더파일 중 output 함수부분만 떼어온 것이다.



위를 정리하면 아래와 같다.




클래스 템플릿은 template <typename T> 을 쓰고 class 클래스이름을 쓴다.

클래스 템플릿 내부의 함수는 클래스 밖 아래에서 구현을 한다.

template <typename T> 과 클래스이름<T>를 쓰고, 함수 이름을 쓴다.



2-2. 템플릿 클래스


템플릿 함수와 마찬가지로 클래스 템플릿을 통해 만들어진 클래스 이다.


메인에서 선언할 때는


cDoubleList<int> intTest;


위와 같이 <int>라고 자료형을 반드시 명시해줘야 한다. 이것이 템플릿 함수와의 차이다.






'예전 > C, C++' 카테고리의 다른 글

[C++] 생성자 소멸자  (0) 2012.06.29
[C++] 템플릿 ( template ) - 템플릿의 특수화  (0) 2012.04.30
[C언어] C스타일 파일입출력  (0) 2012.04.29
[C++] C++ 스타일 파일 입출력  (1) 2012.04.29
[C++] 1차원 배열 셔플  (0) 2012.04.28