반응형
→ 템플릿은 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 것.
- 함수 템플릿(Function Template), 클래스 템플릿(Class Template)로 나뉜다.
- 좀 더 쉽게 템플릿을 설명한다면, 우리는 자료형이라는 게 있다. 이 자료형에 맞게 함수를 작성하거나 매개변수로 넘길 때도 자료형에 맞게 넘겨준다. 그런데 템플릿은 이 자료형을 전부 통합할 수 있다는 이야기이다.
- 템플릿은 컴파일 타임에 코드를 생성하기 때문에 런타임 오버헤드가 없다. 그러나 컴파일러가 템플릿 코드를 컴파일하는 동안 많은 코드가 생성될 수 있으므로 템플릿을 남용하면 컴파일 시간이 길어질 수 있다.
- 또한, 템플릿을 사용할 때 특정한 데이터 타입에 대해 원하는 동작을 보장하기 위해 컴파일 타임에 다양한 타입에 대해 코드를 테스트하는 것이 중요함.
함수 템플릿
- 함수 템플릿을 정의 할 때는 **<typename T>**를 사용하여 ****템플릿 매개변수를 선언한다.
- <typename T>은 함수가 어떤 종류의 데이터 타입을 사용하는지 지정하지 않고, 대신에 호출될 때 사용될 데이터 타입을 나타낸다.
예제를 통해 바로 알아보자
#include <iostream>
// 함수 템플릿 정의
template <typename T>
void swapValues(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
std::cout << "Before swapping: x = " << x << ", y = " << y << std::endl;
// 함수 템플릿 호출
swapValues(x, y);
std::cout << "After swapping: x = " << x << ", y = " << y << std::endl;
double a = 2, b = 4;
std::cout << "Before swapping: a = " << a << ", b = " << b << std::endl;
// 함수 템플릿 호출
swapValues(a, b);
std::cout << "After swapping: a = " << a << ", b = " << b << std::endl;
std::string str = "hi", str2 = "hello";
std::cout << "Before swapping: str = " << str << ", str2 = " << str2 << std::endl;
// 함수 템플릿 호출
swapValues(str, str2);
std::cout << "After swapping: str = " << str << ", str2 = " << str2 << std::endl;
return 0;
}
결과
Before swapping: x = 5, y = 10
After swapping: x = 10, y = 5
Before swapping: a = 2, b = 4
After swapping: a = 4, b = 2
Before swapping: str = hi, str2 = hello
After swapping: str = hello, str2 = hi
클래스 템플릿
→ 클래스 템플릿을 사용하면 다양한 데이터 타입에 대해 일반화된 클래스를 작성할 수 있다.
예제를 통해 확인해보자
- Stack 클래스는 다양한 데이터 타입에 대해 작동 가능하다.
#include <iostream>
#include <vector>
#include <stdexcept>
// 클래스 템플릿 정의
template <typename T>
class Stack {
private:
std::vector<T> elements;
public:
void push(const T& element) {
elements.push_back(element);
}
T pop() {
if (elements.empty()) {
throw std::out_of_range("Stack<>::pop(): empty stack");
}
T elem = elements.back();
elements.pop_back();
return elem;
}
};
int main() {
// 정수형 스택 객체 생성
Stack<int> intStack;
intStack.push(5);
intStack.push(10);
std::cout << "Popped element: " << intStack.pop() << std::endl;
// 실수형 스택 객체 생성
Stack<double> doubleStack;
doubleStack.push(3.14);
doubleStack.push(2.71);
std::cout << "Popped element: " << doubleStack.pop() << std::endl;
return 0;
}
결과
Popped element: 10
Popped element: 2.71
[C++] template(템플릿) 에 관하여 1 (템플릿이란, 함수 템플릿)
[C++] template(템플릿) 에 관하여 1 (템플릿이란, 함수 템플릿)
안녕하세요 BlockDMask 입니다.오늘은 C++에서 자료형을 마음대로 가지고 놀 수 있는, template (템플릿) 에 대해 알아보겠습니다. 1) 템플릿(Template) 이란.함수나 클래스를 개별적으로 다시 작성하지 않
blockdmask.tistory.com
반응형