1. 함수중복과 템플릿함수
함수 중복: 같은 함수지만, 매개변수의 타입이 다르다면 타입만 변경하여 같은 코드로 재작성해줘야 한다.
템플릿: 이러한 중복을 해결하기 위해 함수나 클래스를 일반화 시킨다.
템플릿의 역할
=> 제네릭 함수를 선언하고, 컴파일할 때 함수를 구체화시키기 위한 틀을 만드는 것. (구체화 -> 컴파일 -> 호출)
- generic function (제네릭 함수 = 템플릿 함수)
선언형태: template <class T> void func_name(T & a, T & b)
[ex]
template <class T> void myswap(T &a, T &b) { ... }
- specialization (구체화)
template으로 선언된 함수를 사용해야 할 때, 해당하는 데이터타입으로 템플릿 함수를 구체화시켜 호출하여 컴파일한다.
[ex]
void myswap(int & a, int & b) { ... }
void myswap(double & a, double & b){ ... }
cf > 매개변수를 하나는 int, 다른 하나는 double로 입력 받고 싶다면, template <class T1, class T2>로 제네릭 타입을 매개변수 타입 개수만큼 선언해주면 된다.
cf.2 > 타입이 다른 두 매개변수끼리의 연산은 타입캐스팅을 하면 된다.
ex) dest[i] = (T2) src[i]; //src 타입 = T1
cf.3 > 템플릿 함수에 디폴트 매개변수를 사용하는 경우.
void exfunc(T1 src [ ], T2 dest [ ], int n=1){ ... }
2. 제네릭 클래스
: 제네릭 함수와 비슷한 개념이지만, 클래스이기에 선언부와 구현부를 모두 template으로 선언해준다.
- 선언부
template<class T>
class C_name{ ... // ... 부분에도 T타입으로 변수를 선언할 수 있음
public:
C_name();
void func_name(T parm1);
void func2_name(T parm2);
}
- 구현부
template <class T>
void C_name<T>::func_name(T parm1){ ... }
template <class T> // 아래줄이랑 붙여 써도 됨
void C_name<T>::func2_name(T parm2){ ... }
제네릭 클래스 구체화
: 일반적으로 객체 생성하는 코드인 C_name c; 에서, 객체의 원하는 타입 형태도 같이 선언하면 된다.
=> C_name <int> c; //int 타입을 다루는 C_name의 객체 생성
'C++' 카테고리의 다른 글
[C++] STL(표준 템플릿 라이브러리, Standard Template Library) (0) | 2020.02.10 |
---|