템플릿 기초와 제한: 재사용 코드와 읽기 어려운 추상화 사이
20강. 템플릿 기초와 제한: 재사용 코드와 읽기 어려운 추상화 사이
이번 강의에서 해결할 문제
템플릿은 타입이 다른 코드의 중복을 줄이지만, 한 번만 쓰이는 함수까지 일반화하면 오류 메시지와 의존성이 커집니다. C++17에서는 concepts가 없으므로 본문과 이름으로 필요한 연산을 더욱 명확히 해야 합니다.
학습 목표
먼저 알아야 할 핵심 개념
템플릿은 구체 타입이 사용될 때 해당 타입 버전의 코드를 생성합니다. 함수 본문에서 <, +, 복사 같은 연산을 사용하면 전달 타입이 그 연산을 지원해야 합니다. 오류는 인스턴스화 지점에서 길게 나타날 수 있으므로 작은 템플릿과 명확한 이름이 중요합니다.
왜 이 문제가 위험한가
모든 정책을 템플릿 매개변수로 만들면 컴파일 시간과 오류 메시지가 늘고 구현이 헤더에 노출됩니다. 서로 의미가 다른 두 코드가 문법만 비슷하다고 합치면 한쪽 변경이 다른 도메인에 영향을 줍니다. 중복 몇 줄보다 잘못된 결합이 더 비쌀 수 있습니다.
가장 작은 예제로 시작하기
#include <iostream>
#include <stdexcept>
template <typename T>
T clampValue(const T& value, const T& minimum, const T& maximum) {
if (maximum < minimum) throw std::invalid_argument{"invalid range"};
if (value < minimum) return minimum;
if (maximum < value) return maximum;
return value;
}
int main() {
std::cout << clampValue(12, 0, 10) << '\n';
std::cout << clampValue(0.75, 0.0, 1.0) << '\n';
}
코드 한 줄씩 이해하기
T는 세 인자와 반환의 공통 타입입니다.- 본문은
operator<와 복사 가능한 반환 값을 요구합니다. - 첫 호출은 T가 int, 둘째 호출은 double로 추론됩니다.
- 범위 자체가 잘못되면 정상 clamp 결과가 아니므로 명시적으로 실패합니다.
- 서로 다른 타입 혼합 호출은 별도 변환 정책 없이는 추론되지 않을 수 있습니다.
실행 결과와 메모리·동작 흐름
출력은 10, 0.75입니다. 컴파일러는 사용된 두 구체 타입에 맞는 함수를 생성합니다. 템플릿 정의가 보이지 않거나 요구 연산이 없으면 컴파일·링크 진단이 발생합니다.
단계별 실습
흔한 실수와 해결 방법
언제 사용하고 언제 피할까
타입만 달라지고 의미와 필요한 연산이 같은 작은 알고리즘에 템플릿이 적합합니다. 도메인 의미가 다르거나 한 번만 쓰이며 구체 타입이 더 명확하면 일반화하지 않습니다.
게임 개발 연결
수학·컨테이너 유틸리티처럼 같은 연산 의미가 여러 타입에 반복될 때 유용합니다. 빌드 시간과 헤더 의존성이 중요한 대규모 프로젝트에서는 템플릿 경계를 작게 유지합니다.
이해 점검 질문 3개
- 함수 템플릿이 실제 코드로 인스턴스화되는 시점은 언제인가요?
- clampValue가 T에 요구하는 연산은 무엇인가요?
- 문법이 비슷한 두 함수를 템플릿으로 합치지 않는 편이 나은 경우는 언제인가요?
핵심 요약
다음 강의 연결
21강. 안전한 Modern C++ 문법에서 constexpr, enum class와 범위 기반 for로 의도를 더 명확히 표현합니다.
템플릿 기초와 제한: 재사용 코드와 읽기 어려운 추상화 사이 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.