0. Template이란

  • 적은 소스코드 작성으로 다양한 자료형에 대응하기 위한 함수 혹은 클래스의 틀

 

1. 템플릿의 필요성, 흔히 드는 예

  • C는 안되지만 Cpp는 되는 특징 중에 함수의 오버로딩이 있다.
int Add(int a, int b) { return a + b; }
float Add(float a, float b) { return a + b; }
  • 위 예제처럼 int, float에 대응하는 Add를 오버로딩을 통해 만들 수 있다. 위에 것이 가능한 것도 고맙지만 char, double, 커스텀 자료형에 대응하기 위한 코드를 일일이 작성해줘야 한다.
template<typename T>
T Add(T a, T b) { return a + b; }
  • 위의 문제를 깔끔하게 해결해주는 것이 템플릿이다.

 

2. 특수화

  • 위 Add가 char형에 대해 정상 동작할 수 있을까 ? -> 아니다
  • 모든 자료형에 같은 로직이 가능한 경우는 드물다.
  • 이 때 char에 대해서는 특수화를 해 줄 수 있다.
template<>
char Add /*<char>*/ (char a, char b) { return '\0'; }
  • 함수 이름 뒤에 꺽쇠 괄호로 자료형을 채워주는 부분은 필수는 아니다. 컴파일러가 추론해준다.
  • 마찬가지로 함수를 호출함에 있어서도 꺽쇠괄호는 생략 가능
Add/*<char>*/('c', 'b');

https://blog.plorence.dev/491

구체화, 특수화 등 더 자세한 설명은 위 블로그에서 잘 설명한 것 같네요.

 

3. 클래스 템플릿

  • 멤버 변수를 템플릿 변수로 쓰고자 함
template<typename T>
class DynArr
{
public:
DynArr(int Size)
{
Arr = new T[Size];
}

~DynArr()
{
delete[] Arr;
}

private:
T* Arr;
}
  • 위 코드는 가변 배열의 일부분만 작성한 것인데 멤버변수로 배열의 핵심이 되는 변수를 T로 어떤 타입에든 맞게끔 사용할 수 있다.
  • 템플릿 인자는 여러 개 가능, typename 혹은 class 키워드가 아닌 기본 자료형도 템플릿 인자로 가능, 상속 가능이라는 특징이 있음
  • 문자열을 편하게 다루는 string 클래스도 클래스 템플릿이라고 한다. char형으로 특수화를 했으니 wchar와 호환시키기 위해선 다른 클래스가 필요하다는 뜻이 될 거다.
DynArr<int> MyAynArr;  //클래스 템플릿 인자는 명시적으로 적어줘야 함, 함수는 생략 가능(컴파일러가 추론)

 

4. inline

  • 템플릿 코드들은 대체로 inline으로 처리된다고 들었던 기억이 있다. (사실이 아니라고 한다.) https://www.ikpil.com/1021
  • 템플릿 코드들은 헤더에 정의부와 구현부가 모두 들어있어 별도의 cpp를 구성할 필요가 없다. 아니 할 수 없다.
  • 저 사실을 납득하기까지 꽤 오래 걸렸었는데 템플릿 코드는 코드 작성 '틀'이고 컴파일 타임에 사용하고자 하는 타입에 맞춰 목적 파일에 작성된다고 한다. 템플릿 코드를 사용하고자 하는 곳에서 헤더를 추가하고 사용하고자 하는 자료형을 넣어주면 그 타입에 맞는 코드 작성을 위해(컴파일러가 하는 일) 구현부의 내용이 필요하다. 그렇기 때문에 헤더가 구현부의 내용을 알고 있어야 하는 것
  • inline의 특징 중에 구현부와 정의부가 같은 파일에 정의되어야 한다는 특징이 있는데 그 특징과 템플릿 코드는 한 파일에 같이 적혀 있어야 하는 특징이 맞물려서 템플릿 = inline 이라고 착각하지 않았나 싶다.
  • 템플릿 코드를 작성했으나 헤더에는 정의부만 두고 싶고 구현부는 따로 작성해두고 싶다면 .inl 의 확장자를 가진 파일을 하나 만들어서 기존 cpp 작성한 것과 똑같이 작성을 해주고 헤더 파일의 마지막에 .inl 파일을 include 해주면 된다. 파일 분할 및 미관상 보기 좋다는 효과가 있는 것이지 결국 템플릿 코드가 정의부와 구현부가 같이 있어야 한다는 본질은 바뀌지 않은 것이다.
//SomeTemplateCode.h
#pragma once

template<typename T>
T Add(T a, T b);

#include "SomeTemplateCode.inl"
//SomeTemplateCode.inl
#include "SomeTemplateCode.h"

template<typename T>
T Add(T a, T b)
{
return a + b;
}

'C++ > 키워드 정리' 카테고리의 다른 글

키워드 정리 [12] - 클래스  (4) 2023.12.01
키워드 정리 [11] - OOP  (1) 2023.12.01
키워드 정리 [9] - 포인터  (1) 2023.12.01
키워드 정리 [8] - 정수, 실수  (1) 2023.12.01
키워드 정리 [7] - 컴파일  (1) 2023.12.01

+ Recent posts