10.1 '클래스 템플릿'인가 '템플릿 클래스'인가?
C++에서는 구조체, 클래스와 공용체를 묶어서 클래스형이라고 하며, class나 struct로 시작된 클래스형을 클래스라 합니다. 템플릿인 클래스를 부를 때 모호한 점은 다음과 같습니다.
- 클래스 템플릿은 템플릿인 클래스로 일군의 클래스를 파라미터화해 설명한 것을 지칭합니다
- 템플릿 클래스는 클래스 템플릿의 동의어, 템플릿으로 생성된 클래스 및 템플릿 식별자인 이름을 가지는 클래스 등 여러 상황에 사용됩니다.
따라서 이 책에서는 템플릿 클래스를 사용하지 않았습니다.
10.2 치환, 인스턴스화, 특수화
템플릿을 쓰는 소스코드를 처리할 때 C++ 컴파일러는 템플릿 내의 템플릿 파라미터를 실제 템플릿 인자로 치환하는 일을 여러번 해야합니다. 템플릿의 템플릿 파라미터를 실제 인자로 치환해 일반 클래스, 형식 별칭, 함수, 멤버 함수 혹은 변수를 위한 정의를 만들어내는 과정을 템플릿 인스턴스화라고 합니다.
인스턴스화 혹은 불완전한 인스턴스화로 생성된 실체는 일반적으로 특수화라고 불리며, 직접 템플릿 파라미터에 원하는 값을 치환해 명시적으로 선언하여 만들 수 있습니다.
10.3 선언과 정의
선언이란 C++가 그 이름을 C++ 영역에 도입하거나 재도입한다는 뜻입니다. 이러한 도입 시에는 항상 그 일므의 부분 분류가 포함되지만, 세부 사항이 꼭 필요하지는 않습니다.
정의란 선언에서 자체 구조에 대한 세부 사항이 알려지거나 변수라면 저장 공간이 할당되는 경우를 뜻합니다.
형식은 완전할 수도 불완전할 수도 있는데, 이 둘의 차이는 선언과 정의의 차이점과 밀접하게 연관되어 있습니다. 언어에 따라 완전한 형식이 필요할 수도, 불완전한 형식으로도 유효하게 쓸 수도 있습니다. 불완전한 형식은 다음과 같습니다
- 선언은 됐지만 아직 정의되지 않은 클래스형
- 크기가 지정되지 않은 배열형
- 요소의 형식이 불완전한 배열형
- void
- 사용할 형식이나 열거 값이 정의되지 않은 상태의 열거형
- 위에 정의된 모든 형식에 const나 volatile이 적용된, 형식
이 외의 형식은 모두 완전합니다.
10.4 단정의 법칙
C++ 언어 정의는 다양한 실체들의 재선언에 대해 몇 가지를 제약하는데 이들을 통틀어 단정의 법칙 혹은 ODR(one-definition rule)이라 합니다. 이는 부록 A에서 자세하게 다루어질 것입니다. 기본 법칙은 다음과 같습니다
- 인라인 및 템플릿이 아닌 일반 함수나 멤버 함수, 인라인이 아닌 전역 변수와 정적 데이터 멤버는 한 프로그램 내에서 단 한번만 정의돼야 합니다.
- 클래스형, 템플릿, 인라인 함수 및 변수는 적어도 한 번역 단위(원본 파일을 전처리했을 때의 결과물)마다 최대 한 번 정의돼야 하며, 모든 정의는 동일해야 합니다.
10.5 템플릿 인자와 템플릿 파라미터
템플릿 파라미터는 템플릿 선언이나 정의에서 키워드 template 다음에 나열된 이름들입니다.
템플릿 인자는 템플릿 파라미터의 자리에 대신 들어갈 아이템입니다. 템플릿 파라미터와는 달리 템플릿 인자는 그냥 이름 이상이 될 수 있습니다.
쉽게 생각하면 파라미터는 인자로 초기화됩니다. 템플릿 인자가 템플릿 파라미터에 종속돼 있는가에 관계없이 템플릿 이름의 조합(꺾쇠에 둘러싸인 인자들) 자체는 템플릿 식별자(template id)라고 합니다.
10.6 요약
- 템플릿 인스턴스화는 템플릿 파라미터를 실제의 인자로 치환해 일반 클래스나 함수로 만드는 과정입니다. 그 결과 얻어지는 실체를 특수화라고 합니다
- 형식은 완전할 수도 불완전할 수도 있습니다.
- 단정의 법칙에 따르면 인라인이 아닌 함수, 멤버 함수, 전역 변수와 정적 데이터 멤버는 전체 프로그램 내에 단 한 번만 정의돼야 합니다.
'C++공부 > C++ Templates' 카테고리의 다른 글
12. 템플릿 기초 원리 상세 학습 (0) | 2022.06.17 |
---|---|
11. 일반 라이브러리 (0) | 2022.06.12 |
9. 템플릿 실제 사용 (0) | 2022.06.11 |
8. 컴파일 과정 프로그래밍 (0) | 2022.06.11 |
7. 값으로 전달 또는 참조로 전달 (0) | 2022.06.11 |