본문 바로가기
프로그래밍/C++

C++ 템플릿, 템플릿 함수, 함수 템플릿의 특수화....

by Hwan2 2019. 5. 17.
728x90
반응형

 

 

 

 

 

코딩 공부 또는 어떠한 프로젝트로 인해 코딩을 하게될 경우 하는 기능은 동일하지만, 변수의 Type 때문에 함수를 여러게 만들 경우가 있습니다.

 

간단한 예로 정수의 사칙연산, 실수의 사칙연산이 있겠습니다.

 

#include<iostream>

using namespace std;


int Adder(int x, int y){
    return x + y;
}

double Adder(double x, double y){
    return x + y;
}


int main(void){

    cout << Adder(10, 20) << endl;
    cout << Adder(1.5, 20.999) << endl;

    return 0;
}

 

이런 간단한 연산을 한다고 가정할 때 기능은 동일하지만 변수의 Type 때문에 함수를 2개를 만든 상황입니다.

 

위 예제 같은 경우는 짧고 간결해서 필요 없어 보이지만,

 

코드가 길어져서 해당 기능에 어떤 자료형의 변수가 들어올지 에매할때, 혹은 경우의 수가 많을 때 참 난감합니다.

 

경우의 수를 다 따져 가면서 위와 같이 함수를 여러게 만들어 버리면 코드가 길어지고 가독성이 떨어집니다. 

 

한마디로 난잡해 보인단 말이죠.

 

※제가 int와 double만 예제로 보여드렸지만 해당 함수에는 객체 또한 들어갈 수 있습니다. 

상속 관계에서 여러가지의 객체들이 사용될 경우 경우의 수는 너무나도 많아집니다.

 

이를 해결하기 위한 방법이 바로 템플릿 입니다.

 

선언 방법은 아래와 같습니다.

 

#include<iostream>

using namespace std;

template <class T>
T Adder(T x, T y){
    return x + y;
}

int main(void){

    cout << Adder<int>(10, 20) << endl;
    cout << Adder<double>(1.5, 20.999) << endl;

    cout << Adder(10, 20) << endl;
    cout << Adder(1.5, 20.999) << endl;

    return 0;
}
 

이렇게 선언도 간단하면서 간결해지고 코드의 효율성과 가독성이 높아진걸 볼 수 있습니다.

 

※참고로 함수 뒤에 해당 자료형을 선언해줘도 되지만 안해줘도 컴파일러가 알아서 처리해 줍니다.

하지만 저렇게 함수 뒤에 자료형을 붙여줌으로 써 가독성을 올리는데 도움이 되니 생략하지 맙시다.!!

 

 

템플릿 함수에는 특수화 라는것이 존재 하는데, 이 녀석의 역할은 다음과 같습니다.

 

"컴파일러야, 템플릿 함수가 있는데 특정 type의 변수가 들어오면 내가 따로 정의한 함수로 처리해줘~"

 

라는 뜻입니다.

 

선언 방법은 template<> 입니다.

#include<iostream>
#include<string.h>

using namespace std;

template <class T>
T Adder(T x, T y){
    return x + y;
}

template <>
const char * Adder(const char * arr1, const char * arr2){
    char * a = new char[100];
    strcpy(a, arr1);
    strcat(a, arr2);
    return a;
}
int main(void){
    
    cout << Adder("hello ", "world") << endl;
    cout << Adder(10, 20) << endl;
    cout << Adder(1.5, 20.999) << endl;
    
    r
 

 

이런식으로 사용하면 되겠습니다.!!

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서