본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 17: 템플릿 기초

by cogito21_cpp 2024. 8. 1.
반응형

템플릿 (Templates)

템플릿은 함수나 클래스를 작성할 때, 데이터 타입을 일반화하여 다양한 데이터 타입에 대해 동작할 수 있도록 하는 기능입니다. 템플릿을 사용하면 코드의 재사용성을 높일 수 있습니다.

 

1. 함수 템플릿

함수 템플릿은 데이터 타입에 관계없이 동일한 기능을 수행하는 함수를 작성할 수 있게 합니다.

#include <iostream>

using namespace std;

template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    cout << "Int: " << add(3, 4) << endl;        // Int: 7
    cout << "Double: " << add(2.5, 3.5) << endl; // Double: 6
    cout << "String: " << add(string("Hello "), string("World")) << endl; // String: Hello World
    return 0;
}

 

2. 클래스 템플릿

클래스 템플릿은 데이터 타입에 관계없이 동일한 기능을 수행하는 클래스를 작성할 수 있게 합니다.

#include <iostream>

using namespace std;

template <typename T>
class Calculator {
private:
    T num1, num2;
public:
    Calculator(T n1, T n2) : num1(n1), num2(n2) {}

    T add() {
        return num1 + num2;
    }

    T subtract() {
        return num1 - num2;
    }

    T multiply() {
        return num1 * num2;
    }

    T divide() {
        return num1 / num2;
    }
};

int main() {
    Calculator<int> intCalc(2, 1);
    cout << "Int Add: " << intCalc.add() << endl;       // Int Add: 3
    cout << "Int Subtract: " << intCalc.subtract() << endl; // Int Subtract: 1

    Calculator<double> doubleCalc(2.5, 1.5);
    cout << "Double Add: " << doubleCalc.add() << endl;     // Double Add: 4
    cout << "Double Subtract: " << doubleCalc.subtract() << endl; // Double Subtract: 1

    return 0;
}

 

예제 문제

문제 1: 최대값을 찾는 함수 템플릿 작성

두 개의 값을 받아서 그 중 최대값을 반환하는 함수 템플릿을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << "Max of 3 and 7: " << max(3, 7) << endl; // Max of 3 and 7: 7
    cout << "Max of 3.5 and 2.5: " << max(3.5, 2.5) << endl; // Max of 3.5 and 2.5: 3.5
    cout << "Max of 'a' and 'b': " << max('a', 'b') << endl; // Max of 'a' and 'b': b
    return 0;
}

 

이 프로그램은 두 개의 값을 받아서 최대값을 반환하는 함수 템플릿을 작성합니다.

 

문제 2: 스택 클래스를 템플릿으로 작성

템플릿을 사용하여 임의의 데이터 타입을 저장할 수 있는 스택 클래스를 작성하세요.

 

해설:

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
class Stack {
private:
    vector<T> elements;
public:
    void push(T const& elem) {
        elements.push_back(elem);
    }

    void pop() {
        if (elements.empty()) {
            cout << "Stack is empty." << endl;
        } else {
            elements.pop_back();
        }
    }

    T top() const {
        if (elements.empty()) {
            throw out_of_range("Stack<>::top(): empty stack");
        }
        return elements.back();
    }

    bool empty() const {
        return elements.empty();
    }
};

int main() {
    Stack<int> intStack;
    Stack<string> stringStack;

    intStack.push(1);
    intStack.push(2);
    intStack.push(3);

    cout << "Top of intStack: " << intStack.top() << endl; // Top of intStack: 3

    stringStack.push("Hello");
    stringStack.push("World");

    cout << "Top of stringStack: " << stringStack.top() << endl; // Top of stringStack: World

    return 0;
}

 

이 프로그램은 템플릿을 사용하여 임의의 데이터 타입을 저장할 수 있는 스택 클래스를 작성합니다.

 

문제 3: 큐 클래스를 템플릿으로 작성

템플릿을 사용하여 임의의 데이터 타입을 저장할 수 있는 큐 클래스를 작성하세요.

 

해설:

#include <iostream>
#include <deque>

using namespace std;

template <typename T>
class Queue {
private:
    deque<T> elements;
public:
    void enqueue(T const& elem) {
        elements.push_back(elem);
    }

    void dequeue() {
        if (elements.empty()) {
            cout << "Queue is empty." << endl;
        } else {
            elements.pop_front();
        }
    }

    T front() const {
        if (elements.empty()) {
            throw out_of_range("Queue<>::front(): empty queue");
        }
        return elements.front();
    }

    bool empty() const {
        return elements.empty();
    }
};

int main() {
    Queue<int> intQueue;
    Queue<string> stringQueue;

    intQueue.enqueue(1);
    intQueue.enqueue(2);
    intQueue.enqueue(3);

    cout << "Front of intQueue: " << intQueue.front() << endl; // Front of intQueue: 1

    stringQueue.enqueue("Hello");
    stringQueue.enqueue("World");

    cout << "Front of stringQueue: " << stringQueue.front() << endl; // Front of stringQueue: Hello

    return 0;
}

 

이 프로그램은 템플릿을 사용하여 임의의 데이터 타입을 저장할 수 있는 큐 클래스를 작성합니다.

 

다음 단계

17일차의 목표는 C++의 템플릿 기초에 대해 학습하는 것이었습니다. 다음 날부터는 예외 처리에 대해 다룰 것입니다.

 

내일은 "예외 처리"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형