본문 바로가기
Script/C++

[C++] Chapter 09. 템플릿(Template) #2

by song.ift 2023. 5. 12.

템플릿 : 함수나 클래스를 찍어내는 툴

  1. 함수 템플릿
  2. 클래스 템플릿

 

클래스 템플릿 사용 전

class RandomBox
{
    public:
        int GetRandomData()
        {
            int idx = rand() % 10;
            return _data[idx];
        }
	
    public:
        int _data[10]
}

int main()
{
    srand(time(nullptr));

    RandomBox rb1;
    for (int i = 0; i < 10; ++i)
    {
        rb1.data[i] = i;
    }
    int value1 = rb1.GetRandomData();
    cout << value1 << endl;

    RandomBox rb2;
    for (int i = 0; i < 10; ++i)
    {
        rb2.data[i] = i;
    }
    int value2 = rb2.GetRandomData();
    cout << value2 << endl;
}

두 개의 랜덤박스가 작용한다. 하지만 데이터가 float으로 들어가야 된다고하면 float를 데이터로 하는 RandomBox 클래스를 또 만들어야 한다.

클래스, 데이터가 늘어나야 할 때 마다 설계도를 수정해야하는 건 무식한 방법이 될 것이다.

 

클래스 템플릿 사용

// typename T를 붙이면 '조커카드' (어떤 타입도 다 넣을 수 있음)
// 그런데 무조건 typename을 붙여야 하는 것은 아니다.
// template<>안에 들어가는건 [골라줘야 하는 목록]이라고 볼 수 있음
// 두번째로 받아주는 int 값같은 경우는 추가적으로 값 기입을 해줘야하는 요구사항.
template<typename T, int SIZE = 0>
class RandomBox
{
    public:
        T GetRandomData()
        {
            int idx = rand() % 10;
            return _data[idx];
        }
	
    public:
        T _data[SIZE]
}

int main()
{
    srand(time(nullptr));

    RandomBox<int, 10> rb1;
    for (int i = 0; i < 10; ++i)
    {
        rb1.data[i] = i;
    }
    int value1 = rb1.GetRandomData();
    cout << value1 << endl;

    RandomBox<float, 20> rb2;
    for (int i = 0; i < 20; ++i)
    {
        rb2.data[i] = i;
    }
    float value2 = rb2.GetRandomData();
    cout << value2 << endl;
}

 

응용

int main()
{
    RandomBox<int, 10> rb1;
    RandomBox<int, 10> rb2;

    // 타입이 같아서 대입 가능
    rb1 = rb2;

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

    // 타입이 달라 대입 불가능
    rb1 = rb2;
}

 

템플릿 특수화

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

// 템플릿 특수화
template<int SIZE>
class RandomBox<double, SIZE>
{
    public:
        double GetRandomData()
        {
            int idx = rand() % 10;
            return _data[idx];
        }
	
    public:
        double _data[SIZE]
}

int main()
{
    srand(time(nullptr));

    RandomBox<int, 10> rb1;
    for (int i = 0; i < 10; ++i)
    {
        rb1.data[i] = i;
    }
    int value1 = rb1.GetRandomData();
    cout << value1 << endl;

    RandomBox<double, 20> rb2;
    for (int i = 0; i < 20; ++i)
    {
        rb2.data[i] = i + 0.5;
    }
    double value2 = rb2.GetRandomData();
    cout << value2 << endl;
}

 

💡 결론 - 어떤 타입이건 다 받아줄 수 있는 것이 템플릿

댓글