C++/C++ template

C++ template(템플릿)

재윤 2024. 2. 9. 15:08
반응형

→ 템플릿은 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 것.

  • 함수 템플릿(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

 

반응형