반응형
템플릿 (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++의 템플릿 기초에 대해 학습하는 것이었습니다. 다음 날부터는 예외 처리에 대해 다룰 것입니다.
내일은 "예외 처리"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!
반응형
'-----ETC----- > C++ 마스터 시리즈' 카테고리의 다른 글
[C++ 마스터] Day 19: 표준 템플릿 라이브러리 (STL) 소개 (0) | 2024.08.01 |
---|---|
[C++ 마스터] Day 16: 가상 함수와 추상 클래스 (0) | 2024.08.01 |
[C++ 마스터] Day 15: 상속과 다형성 (0) | 2024.08.01 |
[C++ 마스터] Day 13: 생성자와 소멸자 (0) | 2024.08.01 |
[C++ 마스터] Day 14: 연산자 오버로딩 (0) | 2024.08.01 |