두 개의 정수, 두 개의 실수(float), 그리고 두 개의 문자열을 더할 수 있는 클래스를 만들어야 한다고 가정해 보겠습니다(문자열 덧셈은 사실상 문자열 연결을 의미합니다). 입력의 첫 줄에서는 연산의 총 개수를 나타내는 숫자 n을 받습니다. 이후 각 연산 줄에는 세 가지 요소가 담기는데, 첫 번째는 데이터 타입(int, float, string)이고 두 번째와 세 번째는 연산에 사용될 두 개의 피연산자입니다. 프로그램은 이 값을 읽어 타입에 맞는 연산을 수행한 뒤 결과를 출력해야 합니다.
예를 들어 입력이 다음과 같다면,
5 int 5 7 int 6 9 float 5.25 9.63 string hello world string love C++
출력은 아래와 같습니다.
12 15 14.88 helloworld loveC++
문제 해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- AddItems 클래스 템플릿 정의: add()와 concatenate() 두 개의 멤버 함수를 포함합니다. add()는 정수와 실수의 덧셈을 담당하고, concatenate()는 문자열 연결을 담당합니다.
- main 함수에서의 처리 흐름: 반복문을 통해 각 연산을 순서대로 처리합니다.
- i를 0으로 초기화하고, i < n을 만족하는 동안 i를 1씩 증가시키며 반복합니다.
- 현재 줄의 타입(type)을 읽어 들입니다.
- 타입이 "float"인 경우:
- 두 개의 피연산자 e1과 e2를 입력받습니다.
- e1을 초기값으로 하는 float 타입의 AddItems 객체 myfloat를 생성합니다.
- myfloat.add(e2)를 호출하여 결과를 출력합니다.
- 타입이 "int"인 경우:
- 두 개의 피연산자 e1과 e2를 입력받습니다.
- e1을 초기값으로 하는 int 타입의 AddItems 객체 myint를 생성합니다.
- myint.add(e2)를 호출하여 결과를 출력합니다.
- 타입이 "string"인 경우:
- 두 개의 피연산자 e1과 e2를 입력받습니다.
- e1을 초기값으로 하는 string 타입의 AddItems 객체 mystring을 생성합니다.
- mystring.concatenate(e2)를 호출하여 결과를 출력합니다.
예제 코드
아래 구현 예제를 통해 더 자세히 이해해 보겠습니다.
#include <iostream>
using namespace std;
template <class T>
class AddItems {
T element;
public:
AddItems (T arg) {
element = arg;
}
T add (T e2) {
return element + e2;
}
T concatenate (T e2) {
return element + e2;
}
};
int main(){
int n, i;
cin >> n;
for(i = 0; i < n; i++) {
string type;
cin >> type;
if(type == "float") {
float e1, e2;
cin >> e1 >> e2;
AddItems<float> myfloat (e1);
cout << myfloat.add(e2) << endl;
}
else if(type == "int") {
int e1, e2;
cin >> e1 >> e2;
AddItems<int> myint (e1);
cout << myint.add(e2) << endl;
}
else if(type == "string") {
string e1, e2;
cin >> e1 >> e2;
AddItems<string> mystring (e1);
cout << mystring.concatenate(e2) << endl;
}
}
}입력
5 int 5 7 int 6 9 float 5.25 9.63 string hello world string love C++
출력
12 15 14.88 helloworld loveC++
핵심 정리
이 예제의 핵심은 C++의 클래스 템플릿(template)을 활용하면 하나의 클래스 정의만으로 여러 데이터 타입을 처리할 수 있다는 점입니다. template <class T> 선언을 통해 임의의 타입 매개변수 T를 정의하면, 컴파일러는 AddItems<int>, AddItems<float>, AddItems<string>처럼 실제 사용된 타입에 맞춰 각각의 클래스를 자동으로 생성해 줍니다. 또한 + 연산자가 int와 float에서는 산술 덧셈으로, string에서는 문자열 연결로 오버로딩되어 있기 때문에 add()와 concatenate()가 사실상 동일한 코드임에도 불구하고 각 타입에 맞는 동작을 수행하게 됩니다. 이처럼 템플릿을 활용하면 코드 중복 없이 유연하고 재사용성 높은 프로그램을 작성할 수 있습니다.