관리 메뉴

기억을 위한 기록들

템플릿(Template) 프로그래밍 본문

C & CPP

템플릿(Template) 프로그래밍

에드윈H 2021. 3. 1. 13:57

 

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=Template

템플릿은 형판으로 뭔가를 찍어낼수 있는(?) 뜻이 된다. 마찬가지로 

템플릿 프로그래밍이란 정해진 자료형 타입으로만 하기엔 중복코드가 남발하게 됨으로, 여러 타입을 찍어낼수 있도록 도와준다. 특징을 정리하자면, 

- 코드를 자료형마다 중복으로 작성하지 않아도 됨. (컴파일 도중에 자료형에 맞게 만들어줌)
- 템플릿을 인스턴스화할 때마다 컴파일러가 내부적으로 자료형에 맞게 코드를 생성
( 템플릿에 넣는 자료형 가짓수에 비례해서 exe파일 크기 증가...! / 컴파일 타임에 어느정도 다형성을 부여할 수 있음)
- 컴파일 시간 느려진다.(템플릿 매개변수를 다양하게 할수록 더욱 ) 그러나 런타임 속도는 빠를수도...
  실행파일 크기가 커지기때문에 항상 그런것은 아님. 

1. 함수 템플릿

template <typename T>
T Add(T a, T b)
{
	//..
}
template <class T>
T Add(T a, T b)
{
	//..
}

* typename vs class 차이가 없음. class가 있다고 해서 class 타입만 들어가는 게 아님. int 넣어도 됨.

 

- 함수 템플릿을 호출할 때 템플릿 매개변수를 생략할 수 있음.

Add<int>(3, 10);
Add(3, 10); //<int>을 써주지 않아도 된다.

 

2. 클래스 템플릿

- 특징으로는 헤더 파일(.h) 안에 다 넣어야 한다. 클래스 템플릿을 헤더 파일(.h)과 .cpp파일로 나누게 되면 컴파일러가    cpp파일을 찾지 못한다..

template <class T>
class MyArray
{
public:
    bool Add(T data);
    MyArray();
priavte:
    enum {MAX=3};
    int mSize;
    T mArray[MAX];
}


///...

template<typename T>
MyArray<T>::MyArray()
   : mSize(0)
{
	//...
}

 

- 함수에서는 템플렛 매개변수 자료형 명시 안 해도 되는데 클래스는 에러남.

MyArray<int> scores;
MyArray scores; //error!

 

 

* 크기 다른 배열을 가진 클래스 객체 만들기

template<typename T, size_t N>
class FixedVector
{
//..
private:
	T mArray[N];    
//..
  
}
FixedVector<int, 16> numbers; //int mArray[16];

 

 

* 한개 이상의 템플릿 매개변수

template <typename T,typename U>
T Add(T a, U b)
{
	//..
}

 

 

템플릿 프로그래밍 

 

장점

1. 자료형만 다른 중복코드를 없애는 훌륭한 방법

2. 가상 테이블이 없어서 프로그램이 더 빠름.(근데 exe파일이 커지면 느리질수 있음)

3. 컨테이너의 경우 매우 적합하다.

 

단점

1. 쓸모없는 템플릿 변형을 막을 방법은 없음.

2. 코드 읽기가 힘듦.

3. 디버깅하기가 힘들수도 있음.

 

 

어느정도 기준을 정하고 자료형을 많이 다루면 템플릿을 쓰고 1~2개의 자료형이면 그냥 클래스/함수 쓰자.