21. What — 디자인 패턴이란?
3- 소프트웨어 설계에서 반복적으로 나타나는 문제에 대한 검증된 구조적 해법
4- GoF(Gang of Four)가 23개 패턴을 체계화 (Gamma et al., 1994)
5- 단순 코드 복붙이 아니라, 문제 상황 → 해법 구조 → 트레이드오프를 묶은 설계 언어
6- 비유: 건축의 '아치' 구조 — 매번 재발명하지 않고, 검증된 구조를 상황에 맞게 적용
72. Why — 왜 C++에서 패턴이 "생존 도구"인가?
8- C++은 성능 · 안전성 · 유지보수성을 동시에 요구하는 시스템 언어
9- 잘못된 설계 → 메모리 누수, 컴파일 시간 폭발, 런타임 오버헤드가 즉각 비용으로 돌아옴
10- 패턴을 모르면 같은 버그를 반복한다 — 팀 전체가 동일한 실수를 독립적으로 재현
11- 패턴은 공통 어휘 역할: "여기 Observer 쓰자" 한마디로 설계 의도가 전달됨 (Gamma et al., 1994)
123. C++ 특화 패턴 — 다른 언어에는 없는 이유
13- CRTP (Curiously Recurring Template Pattern)
14 - 가상 함수의 vtable 오버헤드를 컴파일 타임 다형성으로 제거 (Coplien, 1995)
15 - 구조: $\text{class Derived : public Base<Derived>}$
16 - 실제 사례: Eigen 라이브러리 — 행렬 연산에서 가상 호출 0으로 성능 극대화
17 - 트레이드오프: 코드 가독성 ↓, 컴파일 에러 메시지 복잡
18- Pimpl (Pointer to Implementation)
19 - 헤더에 구현 세부사항을 숨겨 컴파일 의존성을 차단 (Sutter, 1999)
20 - 헤더 변경 → 수천 개 파일 재컴파일 문제를 해결
21 - 실제 사례: Qt 프레임워크 — 모든 주요 클래스가 Pimpl 적용 (d-pointer)
22 - 트레이드오프: 힙 할당 1회 추가, 포인터 간접 참조 비용
23- Type Erasure
24 - 템플릿의 타입 경계를 런타임에 제거하여 이질적 타입을 하나의 컨테이너에 저장 (Parent, 2017)
25 - \text{std::function}, \text{std::any}가 대표적 구현
26 - 실제 사례: Adobe ASL — 다형적 객체를 상속 없이 처리
27 - 트레이드오프: 런타임 간접 호출 비용 발생
284. 패턴이 해결하는 3대 축
29- 성능: CRTP로 가상 호출 제거 → 루프 내 수백만 호출에서 측정 가능한 차이
30- 안전성: RAII + Pimpl 조합 → 리소스 누수 원천 차단
31- 유지보수성: Strategy/Observer 등 → 변경 지점을 한 곳으로 격리
325. 안티패턴 경고 — 패턴 남용의 함정
33- "패턴을 위한 패턴" → 불필요한 추상화 계층이 오히려 복잡도 증가 (Stroustrup, 2013)
34- 판단 기준: 같은 구조가 3번 이상 반복될 때 패턴 도입 검토 (Rule of Three)
35- C++에서는 항상 제로 오버헤드 원칙과 대조: 패턴이 런타임 비용을 추가하는가?
366. 핵심 요약
37- 디자인 패턴 = 반복 문제의 검증된 해법 (코드가 아니라 설계 전략)
38- C++에서는 성능 · 컴파일 시간 · 메모리 안전이라는 고유 제약 때문에 언어 특화 패턴이 필수
39- CRTP(컴파일 타임 다형성), Pimpl(컴파일 방화벽), Type Erasure(타입 경계 제거)가 3대 C++ 고유 패턴
40- 패턴을 아는 것 = 같은 실수를 반복하지 않는 것 = 엔지니어의 생존 도구