C_C++

C++ 함수 템플릿(Function Template)

고니자니 2024. 10. 6. 18:51
반응형

C++의 함수 템플릿(Function Template)은 코드의 일반화를 가능하게 해주는 기능입니다. 함수 템플릿을 사용하면 함수의 매개변수 타입에 관계없이 같은 함수 코드를 여러 타입에 대해 사용할 수 있습니다. 이는 동일한 로직을 다양한 데이터 타입에 대해 중복 작성하지 않고 처리할 수 있게 해주므로, 코드의 재사용성을 높이고 유지보수를 용이하게 만듭니다. 

 

함수 템플릿 정의

함수 템플릿을 정의하려면 template 키워드를 사용합니다. 그 뒤에 타입 매개변수를 받는 꺾쇠괄호(<>)를 붙입니다. 타입 매개변수는 주로 T, U 같은 이름으로 지정하지만, 임의의 이름을 사용할 수 있습니다. 

template <typename T>
T add(T a, T b) {
    return a + b;
}

위의 예제는 두 개의 매개변수를 받아서 더한 값을 반환하는 템플릿 함수입니다. T는 타입 매개변수로, 함수가 호출될 때 전달된 인자에 따라 구체적인 타입으로 대체됩니다.

 

함수 템플릿 사용 

템플릿 함수는 호출 시 함수 인자에 따라 타입을 추론하거나 명시적으로 타입을 지정할 수 있습니다.

int main() {
    int x = 5, y = 10;
    double a = 3.5, b = 2.5;

    // int 타입에 대해 템플릿 사용
    std::cout << add(x, y) << std::endl; // 출력: 15

    // double 타입에 대해 템플릿 사용
    std::cout << add(a, b) << std::endl; // 출력: 6.0
}

 

함수 템플릿의 주요 특징

  1. 타입 추론: 함수 템플릿을 호출할 때, 매개변수로 전달된 값의 타입을 바탕으로 템플릿 매개변수의 타입이 자동으로 결정됩니다.
  2. 명시적 타입 지정: 타입 추론이 불가능한 경우, 또는 명시적으로 타입을 지정하고 싶을 때는 호출 시 타입을 지정할 수 있습니다.
std::cout << add<int>(5, 10) << std::endl;

 

다중 타입 매개변수

여러 개의 타입 매개변수를 사용할 수도 있습니다.

template <typename T1, typename T2>
auto multiply(T1 a, T2 b) -> decltype(a * b) {
    return a * b;
}

 

여기서는 T1과 T2라는 두 개의 서로 다른 타입 매개변수를 받는 템플릿 함수를 정의했습니다. 두 매개변수의 곱셈 결과를 반환하는데, decltype을 사용해 결과 타입을 자동으로 추론합니다.

 

기본 템플릿 인자

템플릿 매개변수에 기본값을 지정할 수도 있습니다.

template <typename T = int>
T subtract(T a, T b) {
    return a - b;
}

이 경우, subtract 함수를 호출할 때 타입을 명시하지 않으면 기본적으로 int 타입으로 사용됩니다.

 

장점

  • 코드 재사용성: 여러 타입에 대해 동일한 로직을 중복 작성할 필요가 없습니다.
  • 유지보수 용이성: 코드가 간결해지고 중복이 줄어들어 유지보수가 쉬워집니다.

 

단점

  • 컴파일 시간 증가: 컴파일러가 여러 타입에 대한 인스턴스화를 수행해야 하므로 컴파일 시간이 늘어날 수 있습니다.
  • 템플릿 오류 메시지: 복잡한 템플릿 사용 시 오류 메시지가 이해하기 어려울 수 있습니다.

이처럼 함수 템플릿은 다양한 데이터 타입에 대해 공통의 기능을 제공할 때 매우 유용하게 사용할 수 있습니다.

 

반응형

'C_C++' 카테고리의 다른 글

c++ typedef, 기존 자료형에 새로운 이름 부여  (0) 2024.10.12
c++ 구조체 struct  (0) 2024.10.10
C++: 윤년 구하기  (0) 2024.10.01
C++ 클래스: 다중 상속에 관한 예제  (0) 2024.09.28
scanf 함수 반환값  (3) 2024.08.24