이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)
int getMax(int x, int y)
{
return (x > y) ? x : y;
}
여기 getMax 함수가 있습니다. int형 변수 x와 y를 매개변수로 받은 후,
둘을 비교해서 x가 y보다 크면 x를, x보다 y가 크면 y를 출력합니다.
그런데 getMax 함수를 int형 뿐만 아니라 float, double, char, 등등.. 여러 자료형들도 대상으로 사용한다고 합니다.
float getMax(float x, float y)
{
return (x > y) ? x : y;
}
double getMax(double x, double y)
{
return (x > y) ? x : y;
}
그럼 우리는 이렇게 같은 함수를 복사해서 자료형만 바꿔주는 반복 작업을 해줘야합니다. 이런 단순 작업은 그 과정이 효율적이지 않을 뿐더러 코드의 크기 작을 때는 반복 작업이 뭐 엄청나게 큰 영향을 주지 않을 수도 있겠지만, 코드의 크기가 큰 경우 이건 엄청난 문제로 이어집니다.
이렇게 반복 작업에서 발생하는 비효율과 문제를 해결하기 위한 것이 바로 템플릿template입니다.
템플릿은 함수나 클래스를 정의하기 전에 그것에서 사용할 자료형을 미리 정하는 것인데, 코드를 통해 설명하겠습니다.
template<typename T>
T getMax(T x, T y)
{
return (x > y) ? x : y;
}
템플릿의 사용 방법은 위의 코드 블록과 같습니다.
template을 먼저 입력하고, 홑화살괄호(<>) 속에 typename을 입력합니다. 그 옆에 자료형으로 지칭할 사용할 문자를 적어주시면 됩니다. 자료형으로 지칭할 문자라는 건 함수의 매개변수 정도로 생각하면 될 것 같습니다. 여기서는 T로 정했습니다. 즉, '여기서는 T라는 문자를 자료형typename으로 사용하겠다' 정도의 의미입니다.
그리고 그 밑에 함수 혹은 클래스를 정의하는데, 사용할 자료형 대신 위에서 정한 자료형으로 지칭할 문자를 입력하면 됩니다.
int main()
{
cout << getMax(1, 2) << endl; // 2
cout << getMax(3.14, 1.592) << endl; // 3.14
cout << getMax(1.0f, 3.4f) << endl; // 3.4f
cout << getMax('a', 'c') << endl; // c
return 0;
}
함수는 단 하나만 정의했는데, main함수에서는 int, double, float, char의 자료형을 각기 다르게 대입했음에도 모두 정상적으로 결과가 출력됨을 알 수 있습니다.
기존에는 프로그래머가 일일이 자료형을 수정해야하는 작업을 컴파일러에게 넘겨줬다고 보면 될 것 같습니다.
템플릿에서는 int, float 등 사전에 정의된 자료형 외에, 사용자 정의 자료형인 클래스도 사용이 가능합니다. 다만, 사전에 클래스에 정의해놔야 할 조건들이 좀 필요합니다.
class Cents
{
private:
int m_cents;
public:
Cents(int value) : m_cents(value) {}
friend bool operator > (const Cents& c1, const Cents& c2)
{
return (c1.m_cents > c2.m_cents);
}
friend std::ostream& operator << (std::ostream& out, const Cents& c)
{
out << c.m_cents;
return out;
}
};
Cents라는 클래스를 따로 정의를 했습니다. 여기서 눈여겨보셔야 할 점은 비교 연산자(>)와 출력 연산자(<<)입니다.
위에서 정의한 getMax 함수는 두 값의 크기를 비교하는 기능을 호출합니다. 즉 비교 연산자(>)를 호출합니다.
그리고 main함수에서 출력 연산자(<<)를 통해 getMax 함수가 리턴한 값을 호출합니다.
위의 main함수에서 사용한 int, float, double, char 등의 자료형들은 이미 그 속에 비교, 출력, 산술 등등의 연산자들이 정의되어 있습니다. 그렇기 때문에 우리가 아무런 불편함 없이 다양한 연산자들을 사용할 수 있습니다.
하지만 Cents 클래스와 같이 사용자가 직접 정의한 자료형인 클래스는 사용자가 직접 사용할 연산자를 오버로딩 해줘야합니다.
우리가 main함수에서 사용할 기능은 비교와 출력이기 때문에 두 연산자만 Cents 클래스에 정의했습니다.
int main()
{
cout << getMax(Cents(6), Cents(9)); // 9
return 0;
}
그리고 main 함수에서 getMax 함수에 Cents의 무명객체로 6과 9를 대입한 값을 인자로 주어도 다른 자료형과 같이 더 큰 Cents(9)의 값이 호출되는 걸 볼 수 있습니다!
'Information Technology > C++' 카테고리의 다른 글
[C++] 자료형이 아닌 템플릿 매개변수 (0) | 2019.11.20 |
---|---|
[C++] 클래스 템플릿 (0) | 2019.11.19 |
[C++] 변환 생성자와 explicit (0) | 2019.11.19 |
[C++] 형변환 오버로딩 (1) | 2019.11.17 |
[C++] 첨자 연산자 오버로딩 (0) | 2019.11.17 |