generic type 과 function template

😎·2023년 1월 15일
0

CPP

목록 보기
37/46

generic type

제네릭은 형식(정수, 문자열 등 및 사용자 정의 형식)을 메서드, 클래스 및 인터페이스에 대한 매개 변수로 허용한다.

제네릭 프로그래밍은 코드의 효율성을 증가시키는 방법이다. 자료형이 정수, 문자열, 문자 등 다르더라도 여러 코드를 생성할 필요없이 하나의 코드로 모든 자료형을 받아올 수 있다.

제네릭 프로그래밍의 이점은 다음과 같다.

  1. 코드 재사용성
  2. 함수 오버로딩 방지
  3. 한번 작성하면 여러번 사용할 수 있음.

제네릭은 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;
}


function template

함수 템플릿은 제네릭 형태로 사용할 수 있는 특별한 함수이다. 제네릭 형태를 통해 각 자료형에 대해 전체 코드를 반복하지 않고도 하나 이상의 자료형이나 클래스에 적용할 수 있는 함수 템플릿을 만들 수 있다.

C++ 에서는 템플릿 매개변수를 사용해서 이를 구현할 수 있다. 템플릿 매개변수는 인자로 자료형을 받아오는 특별한 종류의 매개변수다.

함수 템플릿은 다음과 같은 형태로 선언할 수 있다.

  • template <class identifier> function_declaration;
  • template <typename identifier> function_declaration;

classtypename 키워드를 사용한다는 차이가 있다. 두 개의 표현은 정확히 같은 의미를 갖고 같은 방식으로 작동하기 때문에 어떤 것을 사용해도 무관하다.

템플릿 함수 예시를 보자.

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 ) 로 전달된 유형으로 바꾸는 함수를 자동으로 생성한 다음 호출한다.

이 과정은 컴파일러에서 자동으로 수행되고 개발자에게는 안보인다.


참고자료

profile
jaekim

0개의 댓글