int Max( int a, int b );일을 다 끝낸 후 다음 기획서를 보니 캐릭터와 NPC가 전투를 하는 것을 구현해야 되는데 여기에는 경험치를 비교하는 기능이 필요합니다. 구현해야 되는 것은 위에서 만든 Max 함수와 같습니다. 그래서 그것을 사용하였습니다.
#include앗, 체력(HP)을 저장하는 변수의 타입은 int인데, 경험치를 저장하는 변수의 타입은 int가 아닌 float 타입니다.using namespace std; int Max( int a, int b ) { return a > b ? a : b; } void main() { int Char1_HP = 300; int Char2_HP = 400; int MaxCharHP = Max( Char1_HP, Char2_HP ); cout << "HP 중 가장 큰 값은" << MaxCharHP << "입니다." << endl << endl; float Char1_Exp = 250.0f; float Char2_Exp = 250.57f; float MaxCharExp = Max( Char1_Exp, Char2_Exp ); cout << "경험치 중 가장 큰 값은" << MaxCharExp << "입니다." << endl << endl; }
float Max( float a, float b ) { return a > b ? a : b; }함수 오버로딩에 의해 경험치를 비교할 때는 int 타입의 Max가 아닌
__int64 Max(__int64 a, __int64 b ) { return a > b ? a : b; }현재까지만 하더라도 이미 똑같은 로직으로 구현된 함수를 3개나 만들었는데, 게임에서 사용하는 캐릭터의 정보는 HP, 경험치, 돈 이외에도 더 많습니다. 저는 앞으로 Max 함수를 몇 개 더 만들어야 할지 모릅니다. Max 함수의 구현을 고쳐야 한다면 모든 Max 함수를 찾아야 합니다. 함수 오버로딩은 문제를 해결하지만, 코드가 커지고 유지보수는 어렵게 만듭니다.
#include실행한 결과는 다음과 같습니다.using namespace std; // 템플릿으로 만든 값을 비교하는 Max 함수 template T Max(T a, T b ) { return a > b ? a : b; } void main() { int Char1_HP = 300; int Char2_HP = 400; int MaxCharHP = Max( Char1_HP, Char2_HP ); cout << "HP 중 가장 큰 값은" << MaxCharHP << "입니다." << endl << endl; float Char1_Exp = 250.0f; float Char2_Exp = 250.57f; float MaxCharExp = Max( Char1_Exp, Char2_Exp ); cout << "경험치 중 가장 큰 값은" << MaxCharExp << "입니다." << endl << endl; }
int MaxCharHP = Max( Char1_HP, Char2_HP );이후 다음 부분에서 Max를 만나면 이번에도 위의 int 때와 같이 문법 체크를 한 후 에러가 없다면 float를 사용하는 Max 함수 코드를 만듭니다.
float MaxCharExp = Max( Char1_Exp, Char2_Exp );Max가 만들어지는 과정을 나타내면 아래와 같습니다. 모든 타입에 대해 Max 함수를 만드는 것은 아닙니다. 코드에서 사용한 타입에 대해서만 Max 함수가 만들어집니다.
templateconst T& Max(const T& a, const T& b ) { return a > b ? a : b; }
templatetypename과 class는 기능적으로 다른 것이 아닙니다. 템플릿이 표준이 되기 전에는 "class"를 사용했습니다. 그래서 표준화 이전이나 조금 지난 뒤에 나온 책에서는 "class"로 표기했습니다. 그리고 예전에 만들어진 C++ 컴파일러도 템플릿 인자 선언으로 "class"만 지원했습니다. 만약, C++ 표준화 전후에 만들어진 컴파일러에서는 "class"를 사용해야 합니다.const T& Max(const T& a, const T& b ) { return a > b ? a : b; }
// List3의 Max 함수 템플릿을 사용합니다. void 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; }List 6을 컴파일 하면 다음과 같은 에러가 출력됩니다.
max.cpp max.cpp(16) : error C2782: "const T &Max(const T &,const T &)" : 템플릿 매개 변수 "T"이(가) 모호합니다. max.cpp(6) : "Max" 선언을 참조하십시오. "double"일 수 있습니다. 또는 "int" max.cpp(19) : error C2782: "const T &Max(const T &,const T &)" : 템플릿 매개 변수 "T"이(가) 모호합니다. max.cpp(6) : "Max" 선언을 참조하십시오. "int"일 수 있습니다. 또는 "double"이유는 컴파일러는 사람이 아니어서 서로 다른 타입의 인자가 들어오면 템플릿의 파라메터 T를 사용한 함수의 인자 a와 b의 타입을 int로 해야 할지, double로 해야 할지 판단할 수가 없기 때문입니다. 이 문제는 어떻게 해결 해야 될까요?
templateList 7의 함수 템플릿을 사용하면 Max 함수의 인자 타입을 int와 double 혹은 double과 int 타입을 사용해도 컴파일이 잘 됩니다. 그럼 제대로 실행 되는지 실행을 해 볼까요?const T1& Max(const T1& a, const T2& b ) { return a > b ? a : b; }
int Char1_MP = 300; double Char1_SP = 400.25; double MaxValue1 = Max( Char1_MP, Char1_SP );이 코드는 300과 400.25를 비교합니다. 결과는 400.25가 나와야 하는데 400이 나와버렸습니다.
Max( int, double);실수를 하면 찾기 힘든 버그가 발생할 확률이 높습니다.
#include위 코드를 실행한 결과는 아래와 같습니다.using namespace std; // 템플릿으로만든값을비교하는Max 함수 template const T1& Max(const T1& a, const T2& b ) { cout << "Max(const T& a, const T& b) 템플릿 버전 사용" << endl; return a > b ? a : b; } // 전문화시킨Max 함수 template <> const double& Max(const double& a, const double& b) { cout << "Max(const double& a, const double& b) 전문화 버전 사용" << endl; return a > b ? a : b; } void main() { double Char1_MP = 300; double Char1_SP = 400.25; double MaxValue1 = Max( Char1_MP, Char1_SP ); cout << "MP와 SP 중 가장 큰 값은" << MaxValue1 << "입니다." << endl << endl; int Char2_MP = 300; double Char2_SP = 400.25; double MaxValue2 = Max( Char2_MP, Char2_SP ); cout << "MP와 SP 중 가장 큰 값은" << MaxValue2 << "입니다." << endl << endl; }
#includeusing namespace std; // 지정된 값만큼 더해준다. template T AddValue( T const& CurValue) { return CurValue + VAL; } const int EVENT_ADD_HP_VALUE = 50; // 이벤트에 의해 추가 될 HP 값 const int EVENT_ADD_EXP_VALUE = 30; // 이벤트에 의해 추가 될 경험치 const int EVENT_ADD_MONEY_VALUE = 10000; // 이벤트에 의해 추가 될 돈 void main() { int Char_HP = 250; cout << Char_HP <<"에서 이벤트에 의해" << AddValue (Char_HP) << " 로 변경" < (Char_EXP) << " 로 변경" < (Char_MONEY) << " 로 변경" < 실행 결과는 다음과 같습니다.
앞에서 사용했던 함수 템플릿 사용 방법과 좀 틀려서 생소할 수도 있겠네요.
제가 위에 예로든 것은 난 타입 함수 템플릿을 사용해야 되는 당위성이 좀 떨어질 수도 있다고 생각합니다만 설명을 위해서 간단하게 예를 보여주기 위해서 라고 변명해 봅니다. ^^;;
난 타입을 사용하는 템플릿은 다음 회에 이야기 할 클래스 템플릿에서도 또 다시 이야기 할 예정이니 잘 기억하고 있으시기를 바랍니다. 또 난 타입을 잘 사용하면 템플릿 메타 프로그래밍을 할 때 큰 도움이 됩니다. 템플릿 메타 프로그래밍에 대해서는 다음에 설명해 드리겠습니다.
이전 글 : Enterprise Flex RIA 해부(11) : 테스트하기
다음 글 : MPI 두번째 이야기
최신 콘텐츠