title: “C++ 15.템플릿” categories:

  • CspecialCharspecialChar

    #C++ 15.템플릿 : 네이버 블로그

템플릿을 사용하면 함수의 매개변수를 여러 자료형으로 쓸 수 있다

​

먼저 예시를 들겠다

template
void bigger(T a, T b) {
 if (a > b)
 cout << a;
 else
 cout << b;
}

위는 입력된 두개를 비교해 큰것을 출력하는 bigger함수이다

​

먼저 템플릿을 사용하기 위해서는 template을 사용할 함수 앞에 써야한다

꼭 위가 아닌 옆에

templatevoid bigger(T a, T b)

같이 써도 무방하다

​

class T는 T형식의 자료형이란 뜻이다

​

그럼 T형식의 자료형임은 어디서 판단될까?

​

바로 매개변수에서 입력을 T a로 받으면 int a처럼 T형식 a를 받게 된다

​

즉 입력받은 자료형이 T가 된다

​

​

bigger(3,3)이면 T는 int형

bigger(‘a’,’b’)면 T는 char형이다

​

마찬가지로 다른 자료형 double도 포함된다

​

​

만약 매개변수가 서로 다른 자료형이면 어떻게 해야 할까?

그냥 biggere(3,1.1)처럼 실행하면 오류가 나게 된다

​

바로 template<class T1,class T2>처럼 class를 추가하면 된다

​

그럼 T1,T2는 서로 다른 자료형을 가질 수 있다

​

​

​

template를 사용하면 다양한 자료형을 매개변수로 받을 것이다

배열은 T a [] 형식처럼 []만 추가하면 된다

​

중요한 점은 탬플릿을 사용하더라도 이미 정의되어 있는 함수가 있으면 그 함수로 작동된다

​

즉 함수는 매개변수가 다르면 서로 다른 함수가 된다

그러므로 이미 void bigger(int x,int y)가 있는 상태에서 bigger(1,1)을 실행하면 템플릿되어있는 함수가 아닌 정확이 정의가 되어있는 void bigger(int x,int y)가 실행된다

​

이렇게 template를 사용해 다양한 자료형을 받는 것을 일반화라고 하고 이런 함수를 제너릭 함수라 한다

​

​

​

그럼 함수를 일반화하는 방법을 알았고

​

클래스를 일반화해보자

​

​

먼저 마찬가지로

template가 필요하다

그 후 일반적인 클래스 선언을 해준다

T는 매개변수에 따라 달라진다

​

만약 생성자에서 무엇인가 받는다면

이름(T a){

}

의 형식의 생성자를 사용하면 된다

​

아래 예제를 들어보았다

#include
using namespace std;
template
class bigger {
public:
 bigger(T1 a, T2 b) {
 if (a > b)
 cout << a;
 else
 cout << b;
 }
};
int main() {
 int a = 3;
 int b = 5;
 bigger(a, 1.1);
}

마찬가지로 bigger이다

​

class 위에 template를 쓰고

생성자의 매개변수에 따라 다른 생성자가 만들어진다

​

​

​

​

​

​

업데이트: