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를 쓰고

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

업데이트: