Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 클래스 템플릿으로 정수, 실수, 문자열 덧셈까지 한 번에 처리하기

두 개의 정수, 두 개의 실수(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 함수에서의 처리 흐름: 반복문을 통해 각 연산을 순서대로 처리합니다.
  1. i를 0으로 초기화하고, i < n을 만족하는 동안 i를 1씩 증가시키며 반복합니다.
  2. 현재 줄의 타입(type)을 읽어 들입니다.
  3. 타입이 "float"인 경우:
    • 두 개의 피연산자 e1과 e2를 입력받습니다.
    • e1을 초기값으로 하는 float 타입의 AddItems 객체 myfloat를 생성합니다.
    • myfloat.add(e2)를 호출하여 결과를 출력합니다.
  4. 타입이 "int"인 경우:
    • 두 개의 피연산자 e1과 e2를 입력받습니다.
    • e1을 초기값으로 하는 int 타입의 AddItems 객체 myint를 생성합니다.
    • myint.add(e2)를 호출하여 결과를 출력합니다.
  5. 타입이 "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()가 사실상 동일한 코드임에도 불구하고 각 타입에 맞는 동작을 수행하게 됩니다. 이처럼 템플릿을 활용하면 코드 중복 없이 유연하고 재사용성 높은 프로그램을 작성할 수 있습니다.