11 분 소요

1. 템플릿(Template)

  • 형판이라는 뜻
  • 함수나 클래스를 찍어내듯이 생산할 수 있도록 일반화(generic)시키는 도구
    • 함수 템플릿
    • 클래스 템플릿
      template<typename T>
      template<class T>
      // 둘 중에 하나 사용
      


2. 함수 템플릿

  • 매개 변수 타입만 다른 함수의 경우, 함수중복을 통해 작성할 수 있다.
  • 하지만, 프로그램 길이가 길어짐, 실수 가능성, 중복수정 많아짐의 문제가 있다.
// 함수중복을 사용 할 경우,
void Print(int a) { cout << a << endl; }

void Print(float a) { cout << a << endl; }

void Print(char a) { cout << a << endl; }
  • 위의 코드를 함수 템플릿을 사용하여 작성
  • 타입에 따라 서로 다른 함수가 만들어 진다.
// 함수 템플릿을 사용 할 경우,
template<typename T>
void Print(T a)
{
    cout << a << endl;
}

// 여러 타입을 사용 할 경우,
template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
    cout << a << " " << b << endl;
}
  • 장점
    • 함수 코드 재사용 가능 (생산성 ↑, 유연성 ↑)
  • 단점
    • 템플릿이 지원되지 않는 것은 사용 불가능 (포팅에 취약)
    • 템플릿 관련 오류 메시지가 빈약함 (디버깅에 취약)
int main()
{
    // input에 대하여 타입을 추론을 하여 함수가 생성
    Print(10);      // Print<int>(10);
    Print(10.0f);   // Print<float>(10.0f);
    Print('l');     // Print<char>('l');

    // 함수의 타입을 명시적으로 선언
    Print<float>(20);   // Print<float>(20);
    return 0;
}


클래스를 사용 할 경우

class Knight
{
    public:
        int hp = 10;
};

int main()
{
    Knight k;
    Print(k); // Error!
}
  • Knight클래스를 cout하는데에 정의된 함수가 없기 때문에 에러가 난다.
    // Knight 출력 함수
    ostream& operator << (ostream& os, const Knight& k)
    {
      os << k.hp;
      return os;
    }
    


템플릿 특수화

  • 특정 타입에 예외적인 규칙을 적용하고 싶을 때 사용
    template<>
    void Print(Knight a)
    {
      cout << "Knight 입니다. " << endl;
      cout << a << endl;
    }
    


4. 클래스 템플릿

template<typename T, int SIZE=10>
class RandomBox
{
    public:
    T GetRandomData()
    {
        int idx = rand() % SIZE;
        return data[idx];
    }
    public:
    T data[SIZE];
}

int main()
{
    srand(static_cast<unsigned int>(time(nullptr)))l

    RandomBox<int, 10> rb1;
    RandomBox<int, 20> rb2;

    rb1 = rb2 // Error! rb1과 rb2는 완전히 다른 클래스 이다.

    return 0;
}


템플릿 특수화

template<int SIZE>
class RandomBox<double, SIZE>
{
    // ... 생략
}


📑. 참고

카테고리:

업데이트:

댓글남기기