[C++] 템플릿과 제네릭 프로그래밍 <Template>

목차

  1. 템플릿과 제네릭 프로그래밍 설명
  2. 코드 및 설명(with Chat GPT4)

1. 템플릿(Template)이란?

템플릿은 코드의 재사용성을 높이기 위해 설계된 기능으로 템플릿을 사용하면, 데이터 타입에 의존하지 않는 범용적인 클래스나 함수를 작성할 수 있습니다.

 

템플릿 종류

함수 템플릿(Function Templates)
동일한 로직을 다른 데이터 타입에 대해 수행하는 함수를 만들 때 사용하는 템플릿으로, 함수를 정의할 때 특정 타입을 지정하지 않고, 템플릿 매개변수를 사용하여 타입을 나중에 정하는 방식인 템플릿입니다.
클래스 템플릿(Class Temlates)
데이터 타입에 독립적인 클래스를 정의할 때 사용합니다. 이를 통해 다양한 타입에 대해 동작하는 범용적인 클래스를 만들 수 있습니다.

 

 

제네릭 프로그래밍(Generic Programming)

제네릭 프로그래밍은 코딩을 할 때에 데이터 타입을 정해두지 않고 코드를 작성하는 방법입니다. 위 템플릿을 활용하여 자유로운 데이터 타입을 활용시켜 코드의 재사용성, 유연성, 효율성을 높일 수 있습니다.

 

주의사항

컴파일 시간

템플릿은 컴파일 시간을 증가시킬 수 있습니다. 템플릿 기반 코드는 컴파일 시에 타입에 대한 실제 코드를 생성하기 때문입니다.

 

디버깅의 어려움

템플릿은 디버깅을 복잡하게 만들 수 있습니다. 오류 메시지가 길고 복잡해질 수 있기 때문입니다.


2. 제네릭 프로그래밍 코드

함수 템플릿 코드
#include <iostream>

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

int main() {
    std::cout << "10과 20중 큰값 구하기 " << max(10, 20) << std::endl;
    std::cout << "5.7과 7.5중 큰값 구하기 " << max(5.7, 7.5) << std::endl;
    return 0;
}

 

템플릿을 위와 같이 선언하게 되면 자료형을 정하는 것은 main함수에서 함수 템플릿인 max함수에 매개변수값을 지정해 줄 때 지정하게 됩니다.

 

처음max함수에 값을 보내는 값은 정수형인 10과 20이고, 두번째로 보내는 값은 실수형인 5.7과 7.5입니다.

 

원래라면 max(int a, int b)와 max(double a, double b) 이런식으로 두개의 함수를 각각 만들어줘야 했었지만 템플릿을 활용하면 하나의 함수로 코드를 재사용시켜 활용할 수 있게됩니다.

 

클래스 템플릿 코드
#include <iostream>

template <class T>
class MyArray {
private:
    T* array;
    int size;

public:
    MyArray(int s) {
        size = s;
        array = new T[size];
    }

    void set(int index, T value) {
        array[index] = value;
    }

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

    ~MyArray() {
        delete[] array;
    }
};

int main() {
    MyArray<int> intArray(5);
    for(int i = 0; i < 5; i++) {
        intArray.set(i, i * 2);
    }

    std::cout << "int형 Array에서 3번째값: " << intArray.get(3) << std::endl;

    MyArray<double> doubleArray(5);
    for(int i = 0; i < 5; i++) {
        doubleArray.set(i, i * 1.5);
    }

    std::cout << "double형 Array에서 2번째 값: " << doubleArray.get(2) << std::endl;

    return 0;
}

 

클래스에 템플릿을 적용한 코드입니다.

MyArray라는 클래스에 포인터로 배열처럼 구현시켜  main함수에서 for문으로 set함수를 통해 값을 넣어주어 그 후 밑에서 get함수를 통해 n번째 인덱스를 뽑아내는 코드임을 확인 할 수 있습니다.

 

출력결과

 

int형 배열은 0부터 1씩증가하며 2를 곱하는 배열이고 double형 배열도 0부터 1씩 증가하여 1.5를 곱하는 배열이였으니

int형에서 3번 인덱스이므로 0 - 2 - 4 - 6 - 8순으로 6이 나오고

double형에서 2번 인덱스면 0 - 1.5 - 3 - 4.5 - 6 순으로 3이 나오므로 제대로 값이 출력된 것을 볼 수 있습니다.

 

 

 

이렇게 템플릿을 활용하여 제네릭 프로그래밍까지 해보았습니다. 이상입니다.