콘셉트 (제네릭 프로그래밍)

콘셉트는 제네릭 프로그래밍에서 어떤 타입이 지원하는 연산을 기술하는 문법과 시멘틱이다. 여기서 콘셉트는 추상 자료형과 관계가 있으나 서브타입 관계를 요구하지는 않는다.

프로그래밍 언어에서의 사용 
콘셉트라는 용어는 1998년부터 STL에서 사용되어 왔다. STL은 템플릿을 사용하기 시작한 최초의 라이브러리들 중 하나이기 때문이다. 용어를 만들고 널리 알린 사람은 알렉산더 스테파노브(Alexander Stepanov)이며 그는 STL의 주요 설계자이다.

C++ 1998 표준에서 콘셉트는 템플릿 인자로 사용되는 특정 타입의 요구사항을 기술하는 단순한 기능만 했다. 이는 언어에 명시적으로 포함되지 않았다. 콘셉트는 해당 타입의 객체에 적용할 연산, 그리고 작동할 것이라 기대되는 것에 의해서만 표현되었다. C++11에 콘셉트를 언어의 기능으로 포함하자는 제안이 있었다. 하지만 아직 불완전하다는 이유로 거부되었다.

C#과 자바의 제네릭스는 C++의 템플릿과 유사성이 있는데, 여기서 콘셉트의 역할을 인터페이스가 수행한다. 하지만 콘셉트와 인터페이스 사이에는 중요한 차이점이 있다. 템플릿 인자가 특정 인터페이스를 만족해야만 한다면, 해당 인터페이스를 명시적으로 구현한 클래스만이 템플릿 인자로 사용될 수 있다. 콘셉트는 좀 더 유연하게 사용될 수 있는데, 그 이유는 콘셉트를 만족시키는 방법이 두 가지가 있기 때문이다.

 콘셉트 맵을 사용하여, 조건을 만족한다고 명시적으로 정의하기. (인터페이스와는 다르게, 타입 자체에 대하여 정의됨.)
 "자동 콘셉트"가 되도록 암묵적으로 정의하기. 이 방법은 내장 타입과 대비되지 않은 타입에 대하여 사용될 수 있다.

하스켈에서는 콘셉트와 유사한 기능인 type class를 구현하였다.

예시 
만약 I 타입이 Trivial Iterator 콘셉트를 만족한고, i의 타입이 I라면, 다음은 유효한 표현식이다.

 I i 기본 생성자
 *i 어떤 타입 T로 변환 가능해야만 함
 i->m는 유효하다. 만약 (*i).m가 유효하다면.

같이 보기 
 프로토콜 (객체 지향 프로그래밍)
 콘셉트 (C++)
 인터페이스 (자바)
 타입 클래스

참고 문헌

외부 링크 
 Boost Generic Programming Techniques
 Douglas Gregor, et al. Concepts: Linguistic Support for Generic Programming in C++
 Doug Gregor talk on Concepts at Google (video)
 A comparison of C++ concepts and Haskell type classes 

프로그래밍 언어 개념
제네릭 프로그래밍