반응형
안녕하세요. 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++ 을 다 잊고,,, 다시 공부한지 얼마 안되어서 많이 부족합니다.
최대한 아는선에서 & 공부한선에서 & 조사하고 & 직접 해 본 다음에 작성 하도록하겠습니다.
혹, 잘못 게시하거나 제가 잘못 이해하고 있는 부분이 있다면 따끔한 지적 부탁드리겠습니다.
반응형
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] vector container 정리 및 사용법 (41) | 2017.07.20 |
---|---|
[C++] STL 이란. (0) | 2017.07.19 |
[C++] Pair 클래스 정리 및 예제 (vector, sort) (3) | 2017.07.18 |
[C++] 예외처리 (Exception Handling, try catch) (3) | 2017.07.14 |
[C++] template(템플릿) 에 관하여 1 (템플릿이란, 함수 템플릿) (20) | 2017.07.11 |
[C++] string 클래스 변환(atoi, c_str()) 등 정리 (5) | 2017.07.11 |
[C++] string 클래스 정리 (0) | 2017.07.10 |
[C++] string 클래스 만들어보기. (0) | 2017.07.10 |