C++ 템플릿과 STL 컨테이너
템플릿(Template) 기본 개념
C++에서의 템플릿은 코드의 재사용성을 높이기 위한 강력한 도구이다.
템플릿은 함수나 클래스를 정의할 때 특정한 자료형에 의존하지 않고 일반적으로 사용할 수 있도록 만들어준다.
// 예시: 템플릿 함수
template <typename T>
T add(T a, T b) {
return a + b;
}
위의 예시에서 typename T
는 템플릿 매개변수로, 함수를 호출할 때 실제 자료형으로 대체된다.
int result1 = add(3, 5); // add<int>(3, 5)와 동일
float result2 = add(3.14, 2.71); // add<float>(3.14, 2.71)와 동일
템플릿 함수 사용 예시
// myMath.h
template <typename T>
T add(T a, T b) {
return a + b;
}
// main.cpp
#include "myMath.h"
int main() {
std::cout << add<int>(3, 10) << std::endl;
std::cout << add<float>(3.14f, 10.14f) << std::endl;
return 0;
}
- 템플릿에 넣는 자료형의 가짓수에 비례하여 실행파일의 크기가 증가한다.
- 컴파일 타임에 어느정도 다형성을 부여할 수 있다.
- compile time polymorphism
- cpp 파일에 넣으면 컴파일러가 에러를 내뱉는다.
- MyArray.h를 통해서 오직 MyArray 클래스 선언만 볼 수 있다.
- 헤더파일과 선언 파일은 따로 컴파일 된다.
: 헤더파일만 보고 main에서 사용한 add<int>(a, b);이 코드는 해당 자료형에 맞는 코드를 추가하기 위해 구현체를 알아야 한다. 하지만 구현체는 cpp파일에 있기 때문에 컴파일 에러가 일어난다. - 헤더 파일에 구현체를 같이 넣어주어야 한다.
- 컴파일 속도가 느려지는 이유 → 헤더파일은 의존성 문제로 많은 코드들을 같이 컴파일 해야 하기 때문.
템플릿 클래스와 부분 특수화
// FixedVector.h
template<typename T, size_t N>
class FixedVector {
public:
// methods
private:
size_t size;
T mArray[N];
};
위와 같이 템플릿 클래스를 정의할 수 있으며, 특정 자료형과 크기에 따라 여러 가지 인스턴스를 만들 수 있다.
템플릿 특수화(Specialization)
// Power.h
template <typename VAL, typename EXP>
VAL Power(const VAL value, EXP exponent);
template <>
float Power(float value, float exponent);
특정 자료형에 대한 템플릿 특수화를 통해 커스터마이징된 동작을 정의할 수 있다.
> 잘 사용하지 않는다.
템플릿 함수의 장점과 단점
장점:
- 컴파일 타임은 비교적 느리다.
- 템플릿 매개변수를 추가할 수록 더 느려진다.
→ 코드가 많아지기 떄문에 실행파일 크기가 커지고 캐시의 효용성이 떨어져 속도가 느려질 수 있다.
- 런타임 속도는 더 빠를지도 모른다.
- 자료형만 다른 중복 코드를 없애는 좋은 방법이다.
단점:
- 코드의 가독성이 떨어질 수 있다.
- 컴파일 도중에 쓸데없는 템플릿 변형이 많아질 수 있다.
- 실행 파일의 크기가 증가할 수 있다.
템플릿을 사용할 때에는 코드의 유지보수성과 가독성을 고려하여 적절하게 사용하는 것이 중요하다.
컴파일러의 최적화를 활용하여 성능 향상을 도모할 수 있다.
> 서넛 이상의 자료형을 다룬다면 템플릿함수를 작성하는 것이 좋지만, 2개 정도라면 클래스 2개를 만드는 것이 더 좋다.
해당 강의 정리는 여기까지 진행할 예정이다.
보완해야할 점, 부족한 점 등이 있다면 댓글 남겨주세요😊
'Language > C++' 카테고리의 다른 글
[C++] 35.Unmanaged Programming: Map (1) | 2024.01.31 |
---|---|
[C++] 34.Unmanaged Programming: Vector (0) | 2024.01.31 |
[C++] 33.Unmanaged Programming: STL 표준 템플릿 라이브러리 (0) | 2024.01.31 |
[C++] 32.Unmanaged Programming: 적절한 예외 처리 (0) | 2024.01.31 |
[C++] 31.Unmanaged Programming: Exception (1) | 2024.01.31 |