<개인공부>/[C++]

[C++] template(템플릿)에 관하여 2 (클래스 템플릿, 템플릿 특수화)

사용자 BlockDMask 2017. 7. 12. 07:30
반응형

안녕하세요. BlockDMask 입니다.

오늘은 C++ template(템플릿)에 관하여 두번째 시간입니다. 클래스 템플레이트와 템플레이트 특수화에 대해서 배울것 입니다.

혹시 template이 무엇인지 다시한번 복습이 필요하신분들은. [바로가기]


1) 템플릿 특수화 (template specialization)

  • 템플릿(template) 사용할때특수한 자료형에 대해서는 다른 처리를 하고 싶을때 사용합니다.

  • 사용 방법은 아래처럼 template  정의되어있을때같은 함수에 대해서재정의?하고싶은 데이터 타입을 이용해서 아래 주황 글씨처럼 재정의 하면됩니다.
    T
     없애고 넣고싶은 데이터 타입을 넣습니다.
1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
T sum(T a, T b){
   return a + b;
}
 
template<>
char * sum<char*> (char* s1, char* s2){
   char * str= "[char *]문자열은 더할 수 없습니다."
   cout << "s1 : " << s1 << endl;
   cout << "s2 : " << s2 << endl;
   return str; 
}
cs



예시1) sum 이라는 함수가 있을때. 문자열이 들어온 상황에서는 특별한 처리를 하고싶다고 가정한다.


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
#include<string>
using namespace std;
 
template <class T>
T sum(T a, T b){
   return a + b;
}
 
template<>
char * sum<char*> (char* s1, char* s2){
   char * str= "[char *]문자열은 더할 수 없습니다."
   cout << "s1 : " << s1 << endl;
   cout << "s2 : " << s2 << endl;
   return str; 
}
   
template<>
const char * sum<const char*> (const char * s1,const char *s2){
   char * str= "[const char *]문자열은 더할 수 없습니다.";
   cout << "const s1 : " << s1 << endl;
   cout << "const s2 : " << s2 << endl;
   return str; 
}
 
template<>
string sum<string>(string s1, string s2){
   string str = "[string]문자열은 더할 수 없습니다.";
   cout << "string s1 : " << s1 << endl;
   cout << "string s2 : " << s2 << endl
   return str;
}
 
////////////////////TEST CASE/////////////////////
int main(void){
   int a =10;
   int b =20;
   double d1 = 1.1;
   double d2 = 2.2;
   char * s1 = "Dok2 ";
   char * s2 = "On My Way.";
   string s3 = "ZICO";
   string s4 = "Double D";
 
   cout << sum(a, b) << endl << endl;
   cout << sum(d1, d2) << endl << endl;
   cout << sum(s1, s2) << endl << endl;
   cout << sum("Tiger ""JK"<< endl << endl;
   cout << sum<const char*>(s1, s2) << endl << endl;
   cout << sum(s3, s4) << endl;
 
   return 0;
}
cs


> 예시1 결과.



2) 클래스 템플릿 (class template)

  • 클래스 내부의 멤버 변수의 타입에 대해서 template 로 선언 할 때 사용한다.
  • 선언시에 유의할 점 : 멤버 함수를 클래스 외부에서 선언 할때, 꼭 template 선언을 다시 해주어야한다.

  • 클래스 템플릿은 객체를 생성할때 타입을 정해준다.

예시 2-1) 멤버 함수가 클래스 내부에서 선언 되었을 때.

  • 이전에 학습했던, 함수 템플릿 처럼 편하게 사용하면됩니다.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
 
using namespace std;
 
template <class T>
class Person{
private:
    string name;
    T height;
public:
    Person(string name, T height):name(name), height(height){}
 
    void printAll(){
        cout << "name : " << name << endl;
        cout << "number : " << height << endl;
    };
 
    void setName(string name){
        this->name = name;
    }
    void setNumber(T height){
        this->height = height;
    }
};
 
 
int main() {
//객체를 선언할때 <> 안에 template 의 타입을 넣는다.
    Person<int> p1("Mr. Dev C++"173);
    Person<string> p2("Ms. Unix""155cm");
 
    p1.printAll();
    p2.printAll();
    cout << endl;
    p1.setNumber(188);
    p2.setNumber("2m 10cm");
    cout << endl;
    p1.printAll();
    p2.printAll();
    return 0;
}
cs


예시 2-2) 멤버 함수가 클래스 외부에서 선언 되었을 때.

  • 외부에 선언하는 멤버 함수 및 생성자 마다 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
 
using namespace std;
 
template <class T>
class Person{
private:
    string name;
    T height;
public:
    Person(string name, T height);
    void printAll();
    void setName(string name);
    void setNumber(T height);
};
 
template <class T>
Person<T>::Person(string name, T height):name(name), height(height){}
 
template <class T>
void Person<T>::printAll(){
    cout << "name : " << name << endl;
    cout << "number : " << height << endl;
};
 
template <typename T>
void Person<T>::setName(string name){
    this->name = name;
}
 
template <typename T>
void Person<T>::setNumber(T height){
    this->height = height;
}
 
 
int main() {
//main 함수는 동일하다.
    Person<int> p1("Mr. Dev C++"173);
    Person<string> p2("Ms. Unix""155cm");
 
    p1.printAll();
    p2.printAll();
    cout << endl;
    p1.setNumber(188);
    p2.setNumber("2m 10cm");
    cout << endl;
    p1.printAll();
    p2.printAll();
    return 0;
}
cs


> 결과값은 동일하므로 하나만 올리겠습니다.


 ** template를 선언할 때 <typename T>,<class T> 둘다 사용 가능합니다.


**C++ 을 다 잊고,,, 다시 공부한지 얼마 안되어서 많이 부족합니다. 

최대한 아는선에서 & 공부한선에서 & 조사하고 & 직접 해 본 다음에 작성 하도록하겠습니다.
혹, 잘못 게시하거나 제가 잘못 이해하고 있는 부분이 있다면 따끔한 지적 부탁드리겠습니다. 


반응형