C++/C++ : Study

9. Generic Programming과 템플릿 (1) - 개요

더블유제이플로어 2025. 6. 24. 17:17

Generic Programming 과 템플릿

◆  Generic Programming 이란

   ●  Macro를 활용한 Generic Programming

◆  템플릿을 활용한 Generic Programming

   ●   함수 템플릿
   ●   클래스 템플릿


📘 핵심 요약: Generic Programming과 템플릿 학습 개요

학습 배경
C++의 STL(Standard Template Library)은 템플릿 기반으로 구성되어 있으며,
그 동작 원리를 이해하려면 Generic Programming과 템플릿에 대한 개념적 이해가 필요하다.

학습 목표
이번 장에서는 타입에 독립적인 코드를 작성하는 기법인 Generic Programming을 이해하고,
이를 구현하기 위한 도구인 템플릿의 사용 방법을 학습한다.

학습 흐름

  1. Generic Programming 개념
     - 타입에 관계없이 동작할 수 있는 범용 코드를 작성하는 기법
     - 코드 재사용성, 유지 보수성, 확장성 향상에 기여
  2. 매크로 기반 Generic Programming
     - 전통적인 C 스타일 매크로를 활용한 방식
     - 타입 체크가 불가능하고 디버깅이 어려워 안전성이 낮음
  3. 템플릿 기반 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++에서는 제너릭 프로그래밍을 다음 두 가지 방법으로 구현할 수 있다:

  1. 매크로 사용
     - 전통적인 C 스타일 방법
     - 타입 안전성이 없고 디버깅이 어렵기 때문에 주의가 필요하다
  2. 템플릿 사용 (함수 템플릿 / 클래스 템플릿)
     - 타입을 일반화하여 안전하게 구현 가능
     - STL, 사용자 정의 라이브러리 구현에 폭넓게 사용됨
     - 강의에서는 이 방법에 중점적으로 설명할 예정이다

❓ 왜 3가지가 아닌 2가지 방식만 설명하는가?

강의에서 실제로는 제너릭 프로그래밍을 구현하는 방식이 3가지가 존재한다고 언급되었다.
하지만 실무에서 사용성이 떨어지거나 비표준적인 방법은 제외하고
다음 두 가지만 핵심으로 다룬다고 한다:

  1. 매크로 기반 방식
  2. 템플릿 기반 방식 (함수 템플릿 / 클래스 템플릿)

즉, 현실적으로 의미 있는 2가지 방법만 학습하는 것이 실용적이기 때문에
강의 범위에서 축소 설명된 것이다.

❓ 제너릭 프로그래밍 방식 중 생략된 '세 번째 방법'은 무엇인가?

C++에서 제너릭(타입 독립적) 코드를 구현하는 방식은 일반적으로 아래 세 가지로 분류할 수 있다:

  1. 매크로(Macro)
     - 전처리기 수준에서 코드 생성
     - 타입 체크 없음, 디버깅 어려움
  2. 템플릿(Templates)
     - 함수 템플릿, 클래스 템플릿
     - C++의 정식 문법이며 안전하고 강력함
  3. void 포인터(void) 활용*
     - C 스타일로 다양한 타입을 포인터 하나로 처리
     - 예: void* 인자로 받은 데이터를 int*, double* 등으로 변환해서 사용
     - 타입 안정성이 전혀 없고, C++의 타입 시스템을 우회함

✅ 왜 void* 방식은 강의에서 제외되었는가?

  • 현대 C++ 스타일에 부합하지 않음
  • **타입 안정성(type safety)**을 해치므로 버그 발생 가능성 높음
  • 템플릿이 등장한 이후에는 거의 사용되지 않음

즉, void 포인터 방식은 “가능은 하지만 추천하지 않는” 방법이기 때문에
강의에서는 실질적이고 권장되는 2가지 방식만 설명하는 것이다.


https://youtu.be/nn-CVFRfuyE?si=A_PBGfBDWFy8w0PE