[C++] 일반화 프로그래밍과 템플릿

모던 C++에게 있어 템플릿이란…

모던 C++의 빛과 같은 존재

동시에, 템플릿 메타 프로그래밍이라는 난제를 불러온 존재


모던 C++(C++11버전 이상의 버전)에서 절대적으로 많이 쓰이는 개념으로서, 일반화 프로그래밍, 다르게 말하면 제네릭 프로그래밍을 사용하기 위한 C++만의 특수한 키워드입니다.

이 템플릿을 이용하면 생기는 이점이 많아 현재 모던 C++에서는 템플릿을 자주 사용해 프로그래밍하는 것을 지향하고 있습니다.

템플릿은 대체 무엇일까요? 그리고 템플릿을 쓰면 어떤 점이 좋을까요? 지금부터 알아봅시다.

일반화(제네릭) 프로그래밍? 템플릿?


그렇다면, 일반화 프로그래밍이 무엇일까요?

우선, 아래의 함수를 봅시다.

int add(int num1, int num2)
return num1 + num2; }
cs

int형의 두 수를 받아서 더한 값을 int형으로 반환하는 함수입니다. 그렇다면, float형으로 받아서 float형으로 반환하려면 어떻게 해야 할까요?

int add(int num1, int num2)
return num1 + num2; }
 
float add(float num1, float num2)
return num1 + num2; }
cs

그렇습니다. 함수 하나 더 추가하면 되는거죠. 그런데, 여기에서 또 문제가 추가됩니다. double 형으로 받아서 double형으로 출력하라고 한다면?

함수는 또 늘어나겠죠. 지금은 짧은 함수를 적어서 체감이 적겠지만, 나중에 규모가 커진다면 유지보수의 지옥도가 펼쳐질 것입니다.

이를 해결하기 위한 것이 일반화 프로그래밍, 또는 제네릭 프로그래밍이며 C++에서는 template이라는 키워드를 사용해 일반화 프로그래밍을 하는 것입니다.

template 길들이기


이 희한하게 생겨 먹은 template키워드는 함수 템플릿과 클래스 템플릿으로 두 가지 종류가 있습니다.

우선, 함수 템플릿 먼저 살펴보죠.

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

뭔가 좀 특이하죠? 처음 보면 이게 뭔가 싶을테니, 하나하나씩 설명해드리겠습니다.

template는 이 함수가 템플릿 함수라는 것을 나타냅니다.

<typename T>는 사용할 타입의 이름을 대체하는 이름입니다. int, float, double, char 이런거 대신, T라는 이름으로 표시하겠다는 것입니다. 따라서 T 대신 다른 사용자 지정 이름을 써도 상관이 없습니다. 

다른 함수 구현 부분은 같습니다. 다만, 자료형에 따라 바뀌는 부분은 전부 다 자료형을 T로 대체해서 사용합니다.

함수의 사용은 일반적인 함수를 사용할 때와 동일하게 사용하면 됩니다.

다음으로, 클래스 템플릿의 선언 방법입니다. 

template <typename T>
class Data
{
private:
    T data;
public:
    Data(T d):data(d) { }
    void SetData(T d) { ]data = d; }
    T GetData() { return data; }
}
cs

클래스 역시 함수 템플릿과 별다른 것은 없어 보입니다. 그러나, 함수 템플릿과는 다르게 사용 부분에서 차이가 나는 것이 특징입니다. 

Data<int> intData = new Data(10);
Data<char> charData = new Data(‘A’);
cs

사용 방법 역시나 특이합니다. 물론, C++이 익숙하신 분들은 STL에서 굉장히 많이 써먹기에, 처음 보시는 분들만큼 특이하다고 느끼지는 않을 것입니다. 


내용이 너무 길어지네요. C++에서 템플릿이 나왔으면 이게 나와야죠, 다음 포스트에서는 템플릿 특수화에 대해 다루도록 하겠습니다.

글쓴이: BakJH

Student of Daedeok SW Meister Highschool, in Korea.

“[C++] 일반화 프로그래밍과 템플릿”의 2개의 생각

  1. Hello there, My name is Aly and I would like to know if you would have any interest to have your website here at bakjh6280.com promoted as a resource on our blog alychidesign.com ?

    We are updating our do-follow broken link resources to include current and up to date resources for our readers. If you may be interested in being included as a resource on our blog, please let me know.

    Thanks, Aly

    Liked by 1명

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중