제네릭은 형식(정수, 문자열 등 및 사용자 정의 형식)을 메서드, 클래스 및 인터페이스에 대한 매개 변수로 허용한다.
제네릭 프로그래밍은 코드의 효율성을 증가시키는 방법이다. 자료형이 정수, 문자열, 문자 등 다르더라도 여러 코드를 생성할 필요없이 하나의 코드로 모든 자료형을 받아올 수 있다.
제네릭 프로그래밍의 이점은 다음과 같다.
제네릭은 C++ 에서 템플릿을 사용해서 구현될 수 있다. 아래 예시에서 T
가 제네릭 타입
이라고 볼 수 있다.
#include <iostream>
template <typename T>
void swap(T &x, T &y) {
T tmp = x;
x = y;
y = tmp;
}
template <typename T>
T const &min(T const &x, T const &y) {
return (x >= y) ? y : x;
}
template <typename T>
T const &max(T const &x, T const &y) {
return (x > y) ? x : y;
}
T
라는 제네릭 타입
을 생성하고, 값을 바꾸는 swap
과 작은 값과 큰 값을 반환하는 min
, max
함수를 만들었다.
main
문을 보면 int
, string
자료형을 매개변수로 아무 문제 없이 받아오는 것을 확인할 수 있다.
#include "whatever.hpp"
int main(){
int a = 1;
int b = 2;
swap( a, b );
std::cout << "a = " << a << ", b = " << b << std::endl;
std::cout << "min( a, b ) = " << ::min( a, b ) << std::endl;
std::cout << "max( a, b ) = " << ::max( a, b ) << std::endl;
std::string c = "abc";
std::string d = "abc";
swap(c, d);
std::cout << "c = " << c << ", d = " << d << std::endl;
std::cout << "min( c, d ) = " << ::min( c, d ) << std::endl;
std::cout << "max( c, d ) = " << ::max( c, d ) << std::endl;
return 0;
}
함수 템플릿은 제네릭 형태로 사용할 수 있는 특별한 함수이다. 제네릭 형태를 통해 각 자료형에 대해 전체 코드를 반복하지 않고도 하나 이상의 자료형이나 클래스에 적용할 수 있는 함수 템플릿을 만들 수 있다.
C++ 에서는 템플릿 매개변수를 사용해서 이를 구현할 수 있다. 템플릿 매개변수는 인자로 자료형을 받아오는 특별한 종류의 매개변수다.
함수 템플릿은 다음과 같은 형태로 선언할 수 있다.
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
class
와 typename
키워드를 사용한다는 차이가 있다. 두 개의 표현은 정확히 같은 의미를 갖고 같은 방식으로 작동하기 때문에 어떤 것을 사용해도 무관하다.
템플릿 함수 예시를 보자.
template <class myType>
myType GetMax (myType a, myType b) {
return (a > b ? a : b);
}
myType
을 템플릿 매개변수로 템플릿 함수를 생성했다. myType
은 유형이 정해지지 않았다. 하지만 일반 자료형처럼 사용할 수 있다.
함수 템플릿 GetMax
는 2개의 불분명한 형태의 매개변수를 받고 큰 값을 반환한다.
함수 템플릿을 사용하기 위해, 우리는 다음과 같은 형태로 함수를 호출한다.
function_name<type>(parameter);
GetMax 가 int 자료형을 비교한다고 하면 다음과 같이 쓸 수 있다.
int x, y;
GetMax<int>(x, y);
컴파일러가 위 템플릿 함수를 호출하면, myType 을 실제 템플릿 매개변수 ( 위 경우는 int ) 로 전달된 유형으로 바꾸는 함수를 자동으로 생성한 다음 호출한다.
이 과정은 컴파일러에서 자동으로 수행되고 개발자에게는 안보인다.