Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Generic Programming

Generic은 일반적인 총칭하는이라는 뜻을 가진다. 소프트웨어 엔지니어링에서 Generic은 Generic Programming를 의미한다. Generic Programming는 일반적으로 사용할 수 있는 라이브러리, 모듈, 클래스를 개발하기 위한 프로그래밍 기법을 의미한다. Generic Programming를 지향하는 가장 성공적인 라이브러리(:12)는 STL(:12)로 ANSI/ISO C++의 표준이다.

제너릭 프로그래밍은 하나의 알고리즘으로 다양한 데이타입을 처리하며, 또한 알고리즘의 다양한 응용을 가능하도록 하는데 촛점을 맞춘다. 예를 들어 Quick Sort를 알고리즘을 개발할 경우, 제너릭 프로그래밍은 데이터 타입에 관계 없이 하나의 코드를 사용하도록 한다. 또한 하나의 알고리즘으로 역 정렬, 시간 정렬등 다양한 응용이 가능하도록 한다.

Generic Programming를 선택하는 이유는 효율성과 (특히)재사용성을 높이기 위함이다. C++의 경우 Template으로 구현한다. 예를들어 STL(:12)은 Templeate를 이용한 컨테이너와 Generic 알고리즘으로 구성되어 있다.

제너릭 프로그래밍은 재사용성, 범용성을 중요한 지향점으로 한다. 이들 요소는 다음과 같은 특징으로 달성한다.
  • 데이터 형식에 의존하지 않는 자료구조
  • 데이터 형식에 의존하지 않는 알고리즘
C++를 예로 들어보자.

C++에서 일반적인 방법으로 큐(queue)를 만들려고 하면, 자료구조마다 서로 다른 종류의 큐를 만들어야 한다. 문자열을 저장하기 위한 queue, int 형을 저장하기 위한 queue, 구조체를 저장하기 위한 queue 등이다. 이는 좋아보이지 않는다. 동일한 일을 하는 다양한 함수를 만들어야 하기 때문이다. queue는 먼저 입력된 값이 먼저 출력된다라는 일반적인 속성을 가진다. 그렇다면 queue의 본래 속성에만 의존적인 코드를 만들면 좋을 것이다.

C++의 템플릿을 이용하면, 자료형에 의존하지 않는 Generic한 큐를 만들 수 있다.

Generic Programming와 Template Metaprogramming

C++의 템플릿을 이용한 Generic 프로그래밍 방식은 엄밀히 말하자면, Template Metaprogramming으로 분류된다. Template Metaprogramming는 프로그램을 만드는 프로그램을 짜는방식이다. C++에서 템플릿을 사용해서 코드를 만든 후 이것을 c++ 컴파일러로 컴파일하면, 다양한 자료형을 지원하기 위한 프로그램 코드가 생성된다. 문자열, float, int 를 지원하는 범용 큐를 템플릿으로 만들었다면, 이걸 컴파일 하면 3가지 자료형을 위한 코드가 생성되는 식이다.

C++ 템플릿을 사용해서 Generic Programming를 하다보면, 코드 폭발이라는 현상을 경험하기도 하는데, 각 타입별로 코드를 만들어내는 특징에 기인한다. 코드가 폭발하게 되니, 디버깅도 그만큼 힘들다. 개발자가 만들어낸 코드가 아닌, 코드가 생성한 코드에서 에러와 경고가 발생하기 때문이다. STL이 디버깅이 까다롭기로 유명한 이유다.

Generic Programming는 알고리즘을 일반화 하는 것이므로, 둘에 차이가 있다고 하겠다. 그러나 Generic programming를 다루다 보면, 결국 Template Metaprogramming의 코드 생성방식도 함께 고민하게 되므로, 딱히 둘을 엄격하게 구분할 필요는 없어보인다. Generic Programming에서 Template Metaprogramming를 다루는 이유는, 언어를 계속 확장 시키는 것으로만은 Generic Programming를 지향하기가 까다롭기 때문이다. Template Metaprogramming는 언어를 확장시키지 않으면서도, Generic Programming을 달성하기 위한 쉬운 방법을 제공한다.

관련 글