C를 사용하다가 C++로 넘어와서 공부를 시작한 사람이라면 알겠지만 C++은 C와 비슷하지만 C에서 불편한 점들을 개선하거나 바꾼 여러 기능들이 추가적으로 탑재되어 있다 이번 글에서 그 중 특정 상황에서 함수를 작성할 때 코드 재사용성을 매우 높일 수 있는 C++의 제네릭 함수에 대해 소개하려고 한다
제네릭 함수란?
우선 제네릭 함수란 다양한 데이터 타입에 대해 동일한 로직을 적용할 수 있는 함수를 말한다 C++에서는 템플릿이라는 기능을 통해 제네릭 함수를 구현할 수 있는데 이 템플릿을 사용하면 하나의 함수나 클래스가 다양한 타입의 변수들과 함께 작동할 수 있게 되어 앞서 말했듯 코드 재사용성을 매우 높일 수 있다
기본 구조
이제 이러한 제네릭 함수를 만들기 위해서 C++의 템플릿을 사용하여 제네릭 함수를 정의하는 기본 구조를 살펴보겠다
1
2
3
4
template <typename T>
T functionName(T param) {
// 함수 본문
}
1
template <typename T>
이 부분은 함수가 템플릿이며 T라는 이름의 타입을 매개변수로 사용할 것임을 정의하는 부분이고
1
T functionName(T param)
이곳은 함수의 선언 부분으로 여기서 T는 함수의 반환 타입과 매개변수의 타입을 나타낸다
제네릭 함수의 장점
그럼 다음으로 넘어가서 제네릭 함수의 장점을 살펴보면
코드 재사용성 증가
1
2
3
4
5
6
7
8
9
10
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
void swap(char& a, char& b) {
double temp = a;
a = b;
b = temp;
}
c에서 같은 함수라고 해도 다른 타입을 지원하기 위해서는 이렇게 중복되는 코드를 타입만 다르게 해서 또 작성해야 하는 문제가 있는데 이러한 경우에 제네릭 함수는 하나의 함수로 여러 타입에 대응할 수 있어서 코드의 중복을 줄일 수 있다
타입 안전성
템플릿은 컴파일 시간에 타입 체크가 이루어져 실행 시간의 오류를 미리 방지할 수 있다
제네릭 함수 예제
마치기 전 간단한 제네릭 함수 예제를 통해 제네릭 함수를 살펴보고 끝내겠다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
template <typename T>
T findMax(T arr[], int size) {
T max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int arr1[] = {10, 20, 15, 25, 30};
double arr2[] = {3.14, 1.59, 2.65, 3.77, 4.31};
cout << "Int 배열 max 값: " << findMax(arr1, 5) << endl;
cout << "Double 배열 max 값: " << findMax(arr2, 5) << endl;
return 0;
}
위 코드에서 findMax 함수는 정수 배열과 실수 배열 모두에 대해 최대값을 찾을 수 있는 함수로 템플릿을 통해 T라는 제네릭 타입을 사용하여 다양한 데이터 타입에 대해 유연하게 함수를 적용하였다
결론
제네릭은 여러 타입을 지원할 수 있는 기능으로 C++을 비롯한 많은 현대 프로그래밍 언어에서 중요한 개념 중 하나이기에 효율적인 개발을 위해서는 해당 개념을 반드시 이해하고 사용할 수 있어야 한다