클래스를 작성하다보면 클래스나 맴버함수에 정해진 함수형이 아니라 그때 그때 다른 자료형이 사용되는 경우가 있다.
예를들면 stack같은걸 자료구조를 구현하는 경우 필요할때마다 int, string, bool...등등을 담고싶을것이다. 기존 자료형으로만 작성한다면 그때마다 해당 자료형의 stack을 만들거나 override를 해주어야하는데, 이를 해결하는것이 탬플릿(template)이다.
탬플릿을 사용하는 클래스에 프로그래머가 인자로 타입을 넣어주면, 그 타입에 맞춰서 클래스의 탬플릿 형들이 치환된다.
#include <iostream>
template<typename T> // 이거 밑에 오는 클래스는 Test3<T>일때 호출
class Test1 {
public:
Test1() {
std::cout << "<typename T>" << std::endl;
}
};
class Test2 {
//T* t; -> 식별자 "T"이(가) 정의되어 있지 않습니다.C/C++(20)
// 탬플릿 변수를 사용할때마다 template<...>로 명시해줘야 한다.
};
template<typename T1, typename T2> // 이거 밑에 오는 클래스는 Test3<T1, T2>일때 호출
class Test3 {
public:
Test3() {
std::cout << "<typename T1, typename T2>" << std::endl;
}
};
template<typename T1> // 이거 밑에 오는 클래스는 Test3<T1, [...]>일때 호출
class Test3<T1, int> { // Test3<T1, int>로 한정 -> 탬플릿 특수화
public:
Test3() {
std::cout << "<typename T1, int>" << std::endl;
}
};
template<typename T1, typename T2> // 이거 밑에 오는 클래스는 Test3<T1, T2>일때 호출
class Test3<T1,T2*> {
public:
Test3() {
std::cout << "<typename T1, typename T2*>" << std::endl;
}
};
/* template<typename T1> // 이거 밑에 오는 클래스는 Test3<T1, [...]>일때 호출
** class Test3<T1> { <- 클래스 템플릿 "Test3"에 대한 인수가 너무 적습니다.C/C++(442)
** public:
** Test3() {
** std::cout << "<typename T1, typename T2*>" << std::endl;
** }
** };
*/
int main() {
Test1<int> t1;
Test3<int, int> t3;
Test3<int, char> t3_1;
Test3<int, int*> t3_2;
}
#include <iostream>
class Test {
public :
template <typename T>
void test_func1(T t1, T t2) {
std::cout << t1 << ", " << t2 << std::endl;
}
template <typename T, int t2>
void test_func2(T t1) {
std::cout << t1 << ", " << t2 << std::endl;
}
};
int main() {
Test t;
// 탬플릿 인수(<...>)를 명시해야 했던 클래스와 달리,
// 탬플릿 함수에서는 컴파일러가 자동으로 변환을 해준다.
// t.test_func1(4, 2); -> t.test_func1<int>(4, 2);
t.test_func1(4, 2);
t.test_func2<int, 2>(4);
}
mac에서 vscode를 쓰다, 한글 입력이 씹이는 경우가 많아질때
-> vscode의 표시언어구성을 ko로 변경