Data+

8. 함수 템플릿의 이해1

by Qerogram

※ 함수 템플릿.

- 함수 오버로딩 이용시에 유지보수가 어렵다. 하지만 템플릿을 이용하면 이 모든게 해결이 된다.


- Template 정의.(Generic Programming에 많이 이용된다. 아래의 코드에선, int나 float를 T로 Generic화 했다.)

Template <typename type> function - declarator(정의 부)


- virtual function 마냥, 실행시에 평가하지 않고, 컴파일 시에 문구의 에러가 없다면 해당 함수를 생성한다.(오버로딩)

- 참가로 프로그램의 코드 영역에 만들어진다. => 컴파일 시간이 길어질 수 있고, 파일크기가 커질 수 있다.

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) {
  return a > b ? a : b;
}
 
int main() {
  int Char1_HP = 300;
  int Char2_HP = 400;
  int MaxCharHP = Max(Char1_HP, Char2_HP);
  cout << "HP 중 가장 큰 값은 " << MaxCharHP << "입니다." << endl;
  
  float Char1_Exp = 250.0f;
  float Char2_Exp = 250.57f;
  float MaxCharExp = Max(Char1_Exp, Char2_Exp);
  cout << "경험치 중 가장 큰 값은 " << MaxCharExp << "입니다." << endl;
  return 0;
}
cs


* 결과

HP 중 가장 큰 값은 400입니다.
경험치 중 가장 큰 값은 250.57입니다.


- 코드 속도를 개선해보려면, Max()내에서 인자 값을 수정하는 일이 없기때문에, const를 붙여주고

참조를 사용한다(구조체나 클래스로 만들어진 크기가 큰 변수를 사용할 때, 참조를 이용하면 확실히 빠르다)

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> const T& Max(const T& a, const T& b) {
  return a > b ? a : b;
}
 
int main() {
  int Char1_HP = 300;
  int Char2_HP = 400;
  int MaxCharHP = Max(Char1_HP, Char2_HP);
  cout << "HP 중 가장 큰 값은 " << MaxCharHP << "입니다." << endl;
  
  float Char1_Exp = 250.0f;
  float Char2_Exp = 250.57f;
  float MaxCharExp = Max(Char1_Exp, Char2_Exp);
  cout << "경험치 중 가장 큰 값은 " << MaxCharExp << "입니다." << endl;
  return 0;
}
cs


* 만약, 인자의 타입이 서로 다른경우엔 어떻게 될까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
template <typename T> const T& Max(const T& a, const T& b) {
  return a > b ? a : b;
}
 
int main() {
  int Char1_MP = 300;
  double Char1_SP = 400.25;
  double MaxValue1 = Max( Char1_MP, Char1_SP );
  cout << "MP와 SP 중 가장 큰값은" << MaxValue1 << "입니다." << endl << endl;
  double MaxValue2 = Max( Char1_SP, Char1_MP );
  cout << "MP와 SP 중 가장 큰값은" << MaxValue2 << "입니다." << endl << endl
  return 0;
}
cs


- 바로 에러가 나온다. 모호하다면서 말이다.

이런경우 typename을 하나 더 달아주면 문제가 해결된다.



* 참고 : Thinking About C++ STL Programming

'코딩 > C&C++' 카테고리의 다른 글

10. 클래스 템플릿의 이해1  (0) 2017.04.14
9. 함수 템플릿의 이해2  (0) 2017.04.13
7. Merge sort(합병정렬)  (0) 2017.04.10
6. Quick Sort  (0) 2017.04.10
5. void PTR  (0) 2017.04.09

블로그의 정보

Data+

Qerogram

활동하기