강의 보고 공부한 것을 정리하는 목적으로 작성된 글이므로 틀린 점이 있을 수 있음에 양해 부탁드립니다. (피드백 환영입니다)
원래는 우리가
using T = int;
이런식으로 별칭을 만들어서 사용할 수 있었지만
다양한 자료형으로 사용 할 수가 없었다.
하지만 템플릿
을 사용한다면 그 점을 해결할 수 있다.
(C#의 generic
과 비슷하다. 하지만 내용은 더 많은 걸로 알고있다.)
템플릿의 종류에는 함수 템플릿
과 클래스 템플릿
이 있다.
우리가 원래는 자료형을 만족시키기 위해서
Print(int a)
{
}
Print(float a)
{
}
Print(double a)
{
}
이런식으로 오버로딩을 하여 입력을 해주었다.
하지만 템플릿
을 사용하면
template<typename T>
Print(T a)
{
cout << a << endl
}
이런식으로 조커카드처럼 사용할 수 있다.
그러면
Print<int>(1);
Print<float>(3.14);
Print<const char*>("Hello");
이런식으로 사용할 수 있다.
<>를 적지않는다면 암시적으로 변환을 해준다.
이런식으로 템플릿
을 사용하면 하나의 함수가 모든 일을 다 한다고 생각할 수 있는데
각기 자료형이 다른 함수들을 컴파일러가 빌드과정에서 만들어주는 것이다.
그리고 템플릿 인자를 여러개 사용할 수도 있다.
template<typename T1, typename T2>
Print(T1 a, T2 b)
{
cout << a << b<< endl
}
그리고 특정 자료형일 때만 이 함수를 실행했으면 좋겠다고 생각하면
템플릿 특수화를 사용해 구현할 수 있다.
template<typename T>
Print(T a)
{
cout << a << endl
}
template<>
Print(int a)
{
cout << "int" << endl;
}
클래스 템플릿도 함수 템플릿과 별반 다를바가 없다.
template<typename T>
class RandomBox
{
public:
T GetRandomData()
{
int index = rand() % 100;
return data[index];
}
public:
T data[100];
}
이런식으로 사용해 줄 수 있다
애도 함수 템플릿과 마찬가지로 하나의 공용 클래스를 만들어주는 것이 아니라
타입에 따른 다른 클래스(설계도)를 컴파일러가 만들어 주는 것이다.
template<typename T, int SIZE>
class RandomBox
{
public:
T GetRandomData()
{
int index = rand() % SIZE;
return data[index];
}
public:
T data[SIZE];
}
이런식으로 템플릿 인수로 int를 넣어서 값을 받아줄 수도 있다. (반드시 값을 넣어야 한다)
그리고 기본값도 넣어줄 수 있다.
template<typename T = int, int SIZE = 100>
class RandomBox
{
public:
T GetRandomData()
{
int index = rand() % SIZE;
return data[index];
}
public:
T data[SIZE];
}
클래스도 함수 템플릿과 같이 템플릿 특수화를 할 수 있다.
template<typename T = int>
class RandomBox
{
public:
T GetRandomData()
{
int index = rand() % 100;
return data[index];
}
public:
T data[100];
}
template<>
class RandomBox<int>
{
public:
int GetRandomData()
{
int index = rand() % 100;
return data[index];
}
public:
int data[100];
}
템플릿
을 사용하면 함수
나 클래스
를 다양하게 사용할 수 있게 된다.
인수를 정할 때 typename말고 class도 사용가능하지만 요즘에는 typename을 사용한다고 한다. (조금 더 세련된 문법이다)
템플릿은 타입이 결정되는 과정이 실시간으로 진행되는 것이 아닌 컴파일과정에서 결정된다.
그리고 템플릿 코드를 만들 때
어지간하면 .h파일에 다 구현하면 된다.
왜냐하면
.h과 .cpp분리해서 만들면 문법적으로 오류가 엄청 많이 난다.
이유는 아직까지 배우기에는 어렵기 때문에 나중에 알아보도록 하겠다.
이 외에도 다양한 문법이 있다. (복잡하다)