IT 프로그래밍/객체지향프로그래밍

[c++] Generic 프로그래밍과 Template

기술1 2024. 5. 29. 16:36
반응형
int compare(string& v1, string& v2)
{
	if (v1 < v2) return -1;
	if (v2 < v1) return 1;
	return 0;
}
int compare(double& v1, double& v2)
{
	if (v1 < v2) return -1;
	if (v2 < v1) return 1;
	return 0;
}
int compare(int& v1, int& v2)
{
	if (v1 < v2) return -1;
	if (v2 < v1) return 1;
	return 0;
}

기능적으로 같지만 타입이 다르기 때문에 이렇게 세개의 함수를 만들어주고 있습니다. 정수는 정수, 실수는 실수, 문자열은 문자열 이런식으로 되어 있는데요. 논리적으로는 완전히 똑같은데 데이터의 타입이 다르기 때문에 이렇게 해주는 것입니다.

 

이것은 똑같은 로직인데 데이터의 타입이 다르다는 이유만으로 똑같은 함수 여러개를 만들어야 한다는 것은 조금 짜증나는 일입니다. 

 

그래서 c++은 template를 제공하는데요.

 

Template

template <typename T>
int compare(T& v1, T& v2)
{
	if (v1 < v2) return -1;
	if (v2 < v1) return 1;
	return 0;
}

template는 실제 객체가 아니라 실제 객체의 틀이라고 보면 됩니다. 붕어빵이 있을 때 붕어빵을 만드는 틀이라고 생각하시면 됩니다.

 

데이터 타입 T는 실제로 존재하는 것이 아니지만 가상의 타입 T를 매개변수로 받아서 매개변수로 함수를 하는 것인데요. T는 각자의 데이터 타입에 맞게 컴파일러가 알아서 정의를 해주는 것입니다. 

 

출처 / 권오흠 교수님 객체지향플고그래밍

이렇게 해주면 타입이 다를 때 이렇게 해주면 컴파일러가 생성해내는 것입니다. 이는 복잡하고 심오한 일이 아닌 프로그램을 컴파일 할 때 string version의 compare가 필요하네? 라고 하면 알아서 해주는 것입니다. 

 

 

 

#include <iostream>
#include< string>
using namespace std;

template <typename T>
void bubbleSort(T a[], int n)
{
	for (int i = n - 1; i > 0; i--)
		for (int j = 0; j < i; j++)
			if (a[j] > a[j + 1])
				swap(a[j], a[j + 1]);
}

int main()
{
	string s[5] = { "how", "fun", "is", "c++", "programming" };
	int a[5] = { 10, 50, 30, 40, 20 };
	int n = sizeof(a) / sizeof(a[0]);

	bubbleSort<int>(a, n);
	bubbleSort<string>(s, n);

	for (int i = 0; i < n; i++)
		cout << a[i] << " ";
	cout << endl;

	for (int i = 0; i < n; i++)
		cout << s[i] << " ";
	cout << endl;
	return 0; 
}

 

Generic Programming

제네릭 프로그래밍이란 자료형에 의존하지 않는 알고리즘과 데이터 구조를 작성하는 프로그래밍 패러다임입니다. 

 

Function Template와 Class Template는 코드의 재사용성을 높이고 유지 보수성을 향상시키는 강력한 도구입니다. 적절히 사용하면 다양한 데이터 타입을 처리할 수 있는 유연한 프로그램을 작성 가능합니다. 

 

반응형