본문 바로가기
C++

[C++] template (function & class)

by goldory 2020. 2. 10.
728x90
반응형

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의 객체 생성

728x90
반응형

'C++' 카테고리의 다른 글

[C++] STL(표준 템플릿 라이브러리, Standard Template Library)  (0) 2020.02.10