본문 바로가기
IT, 컴퓨터

[C++] template 원리와 사용방법

by 별찌파파 2024. 1. 4.
728x90
반응형
SMALL

Photo by Markus Spiske on Unsplash

 

템플릿에 대해서

 

C++ 템플릿은 강력하고 유연한 프로그래밍 기능으로, 일반화된 코드를 작성할 수 있도록 도와주는 매커니즘입니다. 템플릿은 컴파일 타임에 코드를 생성하며, 컴파일러가 특정한 자료형이나 값을 사용하여 템플릿을 "인스턴스화"합니다. 이를 통해 특정한 자료형이나 알고리즘에 종속되지 않는 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

템플릿 기본 구문:

  1. 함수 템플릿:
    template <typename T>
    T add(T a, T b) {
        return a + b;
    }
    함수 템플릿은 template 키워드를 사용하여 선언되며, <typename T>는 템플릿 매개변수를 선언합니다.
  2. 클래스 템플릿:
    template <typename T>
    class MyContainer {
    private:
        T element;
    public:
        MyContainer(T arg) : element(arg) {}
        T getValue() { return element; }
    };
    클래스 템플릿은 일반적으로 특정한 자료형을 인스턴스화하는 데 사용됩니다.

템플릿 특수화:

// 특수화되지 않은 경우
template <typename T>
void print(T value) {
    std::cout << value << std::endl;
}

// int 자료형에 대한 특수화
template <>
void print<int>(int value) {
    std::cout << "Integer: " << value << std::endl;
}

 

템플릿의 활용:

int main() {
    // 함수 템플릿 사용
    std::cout << add(5, 3) << std::endl;

    // 클래스 템플릿 사용
    MyContainer<double> container(3.14);
    std::cout << container.getValue() << std::endl;

    // 특수화된 템플릿 사용
    print("Hello");
    print(42);  // int에 대한 특수화 버전이 호출됨

    return 0;
}

 

C++ 템플릿은 코드의 일반화와 재사용을 돕는 강력한 기능이지만, 사용 시에 주의가 필요합니다. 오류 메시지가 복잡할 수 있고, 잘못 사용할 경우 코드의 유지보수가 어려워질 수 있습니다. 올바른 사용법을 익히고, 필요한 경우에만 사용하는 것이 중요합니다.

 
함수, 클래스 템플릿 예제
 

1. 함수 템플릿:

#include <iostream>

// 두 값을 교환하는 함수 템플릿
template <typename T>
void swapValues(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int intA = 5, intB = 10;
    double doubleA = 3.14, doubleB = 6.28;

    std::cout << "Before swapping: " << intA << ", " << intB << std::endl;
    swapValues(intA, intB);
    std::cout << "After swapping: " << intA << ", " << intB << std::endl;

    std::cout << "Before swapping: " << doubleA << ", " << doubleB << std::endl;
    swapValues(doubleA, doubleB);
    std::cout << "After swapping: " << doubleA << ", " << doubleB << std::endl;

    return 0;
}
 

2. 클래스 템플릿:

#include <iostream>

// 동적 배열을 저장하는 동적 배열 클래스 템플릿
template <typename T>
class DynamicArray {
private:
    T *array;
    int size;
public:
    DynamicArray(int sz) : size(sz) {
        array = new T[size];
    }

    ~DynamicArray() {
        delete[] array;
    }

    T& operator[](int index) {
        return array[index];
    }

    void display() {
        for (int i = 0; i < size; ++i) {
            std::cout << array[i] << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    // 정수 배열
    DynamicArray<int> intArray(5);
    for (int i = 0; i < 5; ++i) {
        intArray[i] = i * 2;
    }
    std::cout << "Integer Array: ";
    intArray.display();

    // 실수 배열
    DynamicArray<double> doubleArray(3);
    for (int i = 0; i < 3; ++i) {
        doubleArray[i] = i * 1.5;
    }
    std::cout << "Double Array: ";
    doubleArray.display();

    return 0;
}

 

이러한 예제는 C++ 템플릿의 기본적인 사용 방법을 보여줍니다. 함수 템플릿은 다양한 자료형에 대해 동일한 코드를 사용할 수 있게 해주고, 클래스 템플릿은 동일한 구조를 가진 여러 종류의 클래스를 만들 수 있도록 도와줍니다.

728x90
반응형
LIST