Generic Programming 과 템플릿
◆ Generic Programming 이란
● Macro를 활용한 Generic Programming
◆ 템플릿을 활용한 Generic Programming
● 함수 템플릿
● 클래스 템플릿
📘 핵심 요약: Generic Programming과 템플릿 학습 개요
✅ 학습 배경
C++의 STL(Standard Template Library)은 템플릿 기반으로 구성되어 있으며,
그 동작 원리를 이해하려면 Generic Programming과 템플릿에 대한 개념적 이해가 필요하다.
✅ 학습 목표
이번 장에서는 타입에 독립적인 코드를 작성하는 기법인 Generic Programming을 이해하고,
이를 구현하기 위한 도구인 템플릿의 사용 방법을 학습한다.
✅ 학습 흐름
- Generic Programming 개념
- 타입에 관계없이 동작할 수 있는 범용 코드를 작성하는 기법
- 코드 재사용성, 유지 보수성, 확장성 향상에 기여 - 매크로 기반 Generic Programming
- 전통적인 C 스타일 매크로를 활용한 방식
- 타입 체크가 불가능하고 디버깅이 어려워 안전성이 낮음 - 템플릿 기반 Generic Programming
- C++에서 정식으로 제공하는 타입 일반화 기법
- 다음 두 가지 방식으로 구현 가능:
- 함수 템플릿: 다양한 타입에 대해 하나의 함수처럼 동작
- 클래스 템플릿: 다양한 타입에 대해 하나의 클래스처럼 동작
✅ 궁극적 목적
템플릿의 원리를 통해 STL과 같은 템플릿 라이브러리의 구성 방식과 동작 방식을 이해하고,
보다 능동적으로 활용하는 데 도움이 되는 기초 개념을 다지는 것이다.
Generic Programming
◆ 제네릭 프로그래밍
● 간략한 정의-> 타입에 관계없이 동작하는 "일반적인" 코드를 작성하는 방법
● Ex) 여러가지 덧셈을 수행하는 함수들을 작성할 때, 기존에는 아래와 같은 함수들을 개별적으로 구현해야 했음
☞ add(int,int) / add(double, double) / add(Point, Point)
● 이를 한 번의 코드 작성으로 가능하게 하는 방법이 제네릭 프로그래밍 기법
◆ 제네릭 프로그래밍의 구현 방법
● 매크로 사용 <- 주의가 필요함!
● 함수 / 클래스 템플릿 사용
📘 핵심 요약: 제너릭 프로그래밍(Generic Programming)의 개념
✅ 정의
Generic Programming은 타입에 관계없이 일반적으로 동작하는 코드를 작성하는 프로그래밍 기법이다.
일반적이라는 것은, 여러 타입에 대해 하나의 코드로 동일한 동작을 수행할 수 있음을 의미한다.
✅ 기존 방식의 한계
예를 들어 두 개의 값을 더하는 add 함수를 작성할 때,
기존에는 타입별로 다음과 같이 함수 오버로딩을 사용해야 했다:
int add(int a, int b);
double add(double a, double b);
Point add(Point a, Point b);
char add(char a, char b); // 타입이 추가될 때마다 또 구현
➡️ 타입마다 매번 함수를 새로 작성해야 하므로 중복 코드가 발생하고, 유지보수가 어려워진다.
✅ 제너릭 프로그래밍의 핵심
타입이 무엇이든 단 하나의 함수 정의로 모두 처리하고 싶은 욕구에서 출발한다.
예: add(a, b)가 int, double, Point, char 등 다양한 타입에 대해
하나의 구현으로 동작하도록 만들고 싶은 것.
✅ C++에서의 제너릭 구현 방식
C++에서는 제너릭 프로그래밍을 다음 두 가지 방법으로 구현할 수 있다:
- 매크로 사용
- 전통적인 C 스타일 방법
- 타입 안전성이 없고 디버깅이 어렵기 때문에 주의가 필요하다 - 템플릿 사용 (함수 템플릿 / 클래스 템플릿)
- 타입을 일반화하여 안전하게 구현 가능
- STL, 사용자 정의 라이브러리 구현에 폭넓게 사용됨
- 강의에서는 이 방법에 중점적으로 설명할 예정이다
❓ 왜 3가지가 아닌 2가지 방식만 설명하는가?
강의에서 실제로는 제너릭 프로그래밍을 구현하는 방식이 3가지가 존재한다고 언급되었다.
하지만 실무에서 사용성이 떨어지거나 비표준적인 방법은 제외하고
다음 두 가지만 핵심으로 다룬다고 한다:
- 매크로 기반 방식
- 템플릿 기반 방식 (함수 템플릿 / 클래스 템플릿)
즉, 현실적으로 의미 있는 2가지 방법만 학습하는 것이 실용적이기 때문에
강의 범위에서 축소 설명된 것이다.
❓ 제너릭 프로그래밍 방식 중 생략된 '세 번째 방법'은 무엇인가?
C++에서 제너릭(타입 독립적) 코드를 구현하는 방식은 일반적으로 아래 세 가지로 분류할 수 있다:
- 매크로(Macro)
- 전처리기 수준에서 코드 생성
- 타입 체크 없음, 디버깅 어려움 - 템플릿(Templates)
- 함수 템플릿, 클래스 템플릿
- C++의 정식 문법이며 안전하고 강력함 - void 포인터(void) 활용*
- C 스타일로 다양한 타입을 포인터 하나로 처리
- 예: void* 인자로 받은 데이터를 int*, double* 등으로 변환해서 사용
- 타입 안정성이 전혀 없고, C++의 타입 시스템을 우회함
✅ 왜 void* 방식은 강의에서 제외되었는가?
- 현대 C++ 스타일에 부합하지 않음
- **타입 안정성(type safety)**을 해치므로 버그 발생 가능성 높음
- 템플릿이 등장한 이후에는 거의 사용되지 않음
즉, void 포인터 방식은 “가능은 하지만 추천하지 않는” 방법이기 때문에
강의에서는 실질적이고 권장되는 2가지 방식만 설명하는 것이다.
https://youtu.be/nn-CVFRfuyE?si=A_PBGfBDWFy8w0PE
'C++ > C++ : Study' 카테고리의 다른 글
9. Generic Programming과 템플릿 (3) - 함수 템플릿 (6) | 2025.06.26 |
---|---|
9. Generic Programming과 템플릿 (2) - 매크로 사용 (1) | 2025.06.25 |
8. 연산자 오버로딩 (10) - 첨자 연산자 오버로딩 (1) | 2025.06.22 |
8. 연산자 오버로딩 (9) - 첨자 연산자 오버로딩 (2) | 2025.06.22 |
8. 연산자 오버로딩 (8) - 대입 연산자 , 깊은 복사 (3) | 2025.06.21 |