개요
동일한 기능이지만 매개변수의 타입이 호환되지 않아서 중복 코드를 작성하는 경우가 있을 것이다. 오버로딩이라고 하는데 예를 들어, (정수) + (정수)로 함수를 구현했다가 (실수) + (실수)를 해야하는 경우에는 매개변수의 타입만 실수로 바꿔서 추가로 작성해야한다.
C++에서는 이런 중복코드 작성을 방지하기위해 템플릿이라는 기능을 제공한다. 오늘은 템플릿이 무엇인지, 장단점은 무엇인지 알아보자 !
1. 템플릿이란
앞서 설명했듯, 중복코드 작성을 방지하기위해 C++에서 제공하는 기능이다. 템플릿으로 함수를 구현하면 컴파일러가 다양한 타입에 맞게 함수를 만들어준다고 한다. 때문에 템플릿을 활용하여 계산기를 구현하면, 매개변수로 정수를 넘겨주든, 실수를 넘겨주든 버그가 나지 않고 정상적으로 작동한다.
사용하는 방법은 내가 작성하는 함수위에 template <typename T> 코드를 추가해준 후 원하는 매개변수의 타입을 T로 지정해주면 된다.
2. 코드 예시
계산기 예시
#include <iostream>
using namespace std;
template <typename T>
T add(T x, T y) {
return x + y;
}
int main() {
cout << add(3, 4) << endl; // 정수형 덧셈
cout << add(3.3, 4.2) << endl; // 실수형 덧셈
return 0;
}
Swap 예시
#include <iostream>
using namespace std;
template <typename T>
void swapValues(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
swapValues(x, y);
cout << "Swapped int values: x = " << x << ", y = " << y << endl;
double p = 3.14, q = 2.71;
swapValues(p, q);
cout << "Swapped double values: p = " << p << ", q = " << q << endl;
return 0;
}
3. 템플릿의 장단점
템플릿의 정의와 코드를 살펴봤다. 어 그러면 템플릿을 무조건 써야겠네? 라고 생각할 수도 있다. 실제로 코드의 중복성을 줄여주고, 다양한 타입에 호환되기때문에 버그가 날 확률도 감소한다. 다만, 몇 가지 유의할 점이 있다.
프로젝트를 진행하다보면 동료 개발자와 협업하는 경우가 있을텐데, 템플릿으로 함수를 구현하게되면 동료 개발자가 코드를 봤을 때 함수의 정확한 용도를 파악하기 힘들다. 계산함수를 예로 들어보면, 숫자와 숫자를 더하는 용도라고 생각할 수도 있지만 문자열과 문자열을 합치는 용도로 볼 수도 있다.
다음으로는 다양한 타입에 호환되는 함수를 컴파일러가 만들어주기때문에 컴파일 시간이 느리고, 다형성으로인해 프로그램이 느려질 수 있다.
이런 특징들로인해 템플릿을 무조건 사용하는 것은 지양하고, 오버로딩이 많아 보이는 함수에 사용하는 것이 좋아보인다.
템플릿의 장단점
- 장점
1. 코드 재사용성을 높인다
2. 타입 독립성을 제공한다
- 단점
1. 코드 가독성이 감소한다
2. 컴파일 시간과 프로그램이 느려질 수 있다.
느낀 점
나도 템플릿을 처음 접했을 때 모든 함수를 템플릿으로 구현하면 되겠다고 생각했다. 하지만 구글링을 통해 템플릿에 대해 알아보니 예상치 못한 단점들이 있음을 알게 되었다. 그 중 하나는 코드의 가독성이 떨어진다는 점이었다. 나는 오버로딩을 여러 번 사용하는 것보다 템플릿이 더 나을 거라고 생각했지만, 동료 개발자들에겐 오히려 한 눈에 파악하기 어려운 코드가 될 수 있다는 사실을 알게 되었다. 이 경험은 나에게 코드를 바라보는 시각을 넓혀주는 계기가 되었다
더 공부하다 보면 템플릿과 비슷한 유용한 기능들을 많이 알게 될 것이다. 그럴 때마다 '무조건 이것만 사용해야지!' 하는 생각보다는 경각심을 가지고 한 번 더 깊이 있게 살펴보는 시간을 가지자 !
'C++ > 문법 정리' 카테고리의 다른 글
[C++] STL 컨테이너 선택 가이드 (0) | 2025.01.03 |
---|---|
[C++] 객체지향 프로그래밍의 개념 (1) | 2025.01.02 |
[C++] Dangling Pointer 대신 Smart Pointer 로 (1) | 2024.12.30 |
[C++] 오버로딩 vs 오버라이딩 (1) | 2024.12.27 |
[C++] Class의 개념 (0) | 2024.12.27 |