728x90
1. 템플릿
템플릿은 함수나 클래스의 형틀입니다. 형틀에는 다양한 자료형을 넣고 사용할 수 있습니다. 필요에 따라 원하는 함수나 클래스로 템플릿을 이용해 찍어낼 수 있습니다.
2. 함수 템플릿
두개의 수를 비교하여 큰값을 얻는 함수를 만든다고 가정합시다. 그런 함수는 아래와 같게 됩니다.
1 2 3 4 5 6 7 | int intMax(int a,int b){ if(a>b){ return a; }else{ return b; } } | cs |
위 함수는 int형만 비교할 수 있기 때문에 double형을 위한 함수도 생성합니다.
1 2 3 4 5 6 7 8 | double doubleMax(double a,double b){ if(a>b){ return a; }else{ return b; } } | cs |
생각해보니 c++에선 자료형이 매우 많아서 각 자료형마다 비교하는 함수를 만들어 줘야합니다. 이렇게 되면 하루종일 비교함수만 만들게 될 것입니다.
이러한 작업을 줄이기 위해 template을 사용합니다.
template을 사용 하면 아래와 같이 하나의 함수만으로 모든 자료형을 비교할 수 있습니다.
1 2 3 4 5 6 7 8 | template<typename T> T max(T& a,T& b){ if(a>b){ return a; }else{ return b; } } | cs |
template<typename T>를 이용하여 해당 함수를 템플릿으로 정의합니다. 템플릿함수에서 쓰일 자료형은 <Typename T>로 인해 T라는 자료형이 되게됩니다. 인자를 받을 때 T의 참조자(reference)를 이용합니다.
typename을 class로 하여 <class T>로 사용해도 됩니다.
위 함수를 이용하여 큰값을 출력하는 코드를 작성해 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> using namespace std; template<typename T> T max(T& a,T& b){ if(a>b){ return a; }else{ return b; } } int main(int argc, char** argv) { int i1 = -101, i2 = 2016; cout << max(i1,i2) << endl; double d1 = 3.14, d2 = 3.141516; cout << max(d1,d2) << endl; return 0; } | cs |
출력결과
2016 3.14152 |
3. 클래스 템플릿(Class Template)
템플릿을 클래스에 적용하면 그것이 클래스 템플릿입니다.
아래 코드를 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> using namespace std; template <typename T1=int, typename T2=double> //initial type class A{ private: T1 value1; T2 value2; public: A(const T1& v1, const T2& v2){ value1 = v1; value2 = v2; } const T1& GetFirstValue() const{ return value1; } const T2& GetSecondValue() const{ return value2; } }; int main(int argc, char** argv) { A<> myA(20,10.09); cout << myA.GetFirstValue() << endl; cout << myA.GetSecondValue() << endl; A<string, string> mymyA("22", "Learn template, love C++"); cout << mymyA.GetFirstValue() << endl; cout << mymyA.GetSecondValue() << endl; return 0; } | cs |
출력결과
20 10.09 22 Learn template, love C++ |
typename에 초기형을 선언하여, 만약 클래스 선언시에 형을 선언하지 않았다면 초기형으로 자료형을 설정할 수도 있습니다.
'CS > C++' 카테고리의 다른 글
[C++]다형성(Polymorphism) (0) | 2016.06.07 |
---|---|
[C++]복사생성자(Copy Constructor) (0) | 2016.06.07 |
[C++]상속 접근 지시자 (0) | 2016.06.07 |
[C++] 다중상속(Multiple inheritance) (0) | 2016.06.07 |