2What — 문제: 타입마다 같은 함수를 반복 작성해야 한다
3- 정수의 최댓값을 구하는 max(int, int)를 작성했다고 하자
4- 실수가 필요하면 max(double, double), 문자열이면 max(string, string)을 또 만들어야 한다
5- 로직은 a > b ? a : b 로 완전히 동일한데, 타입 시그니처만 다르다
6- 이것이 함수 오버로딩(function overloading)의 한계:
7 • 사용자 정의 타입(Point, Matrix 등)이 추가될 때마다 새 오버로드 필요
8 • 타입은 무한히 늘어날 수 있으므로, 오버로딩만으로는 근본적 해결 불가
9 • 하나의 오버로드에서 버그를 수정하면 나머지도 전부 수정해야 → 유지보수 악몽
10Why — 제네릭 프로그래밍: 알고리즘은 타입에 독립적이어야 한다
11- 핵심 통찰: "비교 가능하기만 하면 어떤 타입이든 max를 구할 수 있다"
12- 이것이 제네릭 프로그래밍(Generic Programming) 패러다임의 출발점 (Stepanov & Musser, 1998)
13- 알고리즘의 본질(비교, 정렬, 탐색)을 특정 타입에서 분리하여, 타입을 매개변수화하는 것이 목표
14- C++의 해법이 바로 템플릿(template):
15 • template<typename\ T> 로 타입 T를 변수처럼 선언
16 • 컴파일러가 실제 사용 시점에 구체 타입을 대입하여 코드를 생성(인스턴스화)
17 • 하나의 템플릿으로 무한한 타입을 커버 → 오버로딩 폭발 문제 해결
18How — STL 전체가 템플릿으로 만들어져 있다
19- 우리가 매일 쓰는 STL 코드가 사실 모두 템플릿 인스턴스화 결과:
20 • std::vector<int> → vector 클래스 템플릿에 int를 대입
21 • std::sort(v.begin(), v.end()) → 이터레이터 타입에 맞게 sort 함수 템플릿 인스턴스화
22 • std::pair<string, int> → 두 타입을 매개변수로 받는 클래스 템플릿
23- STL 설계 자체가 "컨테이너 × 알고리즘 × 이터레이터"를 템플릿으로 조합하는 구조 (Stepanov, 1994)
24컴파일 타임 다형성 vs 런타임 다형성
25- 런타임 다형성 (virtual 함수):
26 • vtable을 통해 실행 시점에 호출할 함수를 결정
27 • 간접 호출 비용 + 인라인 최적화 불가
28- 컴파일 타임 다형성 (템플릿):
29 • 컴파일 시점에 구체 타입별 코드가 생성됨 → 런타임 오버헤드 제로
30 • 컴파일러가 각 인스턴스를 최적화(인라인 등) 가능
31 • 단점: 컴파일 시간 증가, 에러 메시지 난해 (C++20 Concepts로 개선)
32- 비유: virtual은 "메뉴판 보고 주문" (실행 시점 결정), 템플릿은 "주방에서 미리 모든 요리를 만들어 놓기" (컴파일 시점 결정)
33정리 — 템플릿이 필요한 이유
34- 같은 로직의 타입별 복사-붙여넣기를 제거 → DRY 원칙
35- 타입 안전성 유지: void 포인터나 매크로와 달리 컴파일 타임 타입 검사
36- 성능 손실 없음: 런타임 간접 호출 없이 구체 타입에 최적화된 코드 생성
37- STL이라는 강력한 라이브러리의 설계 기반 → 템플릿 없이는 C++ 표준 라이브러리가 존재할 수 없다