C++프로그래밍/자료구조,알고리즘(추후확장)

클래스 템플릿

season97 2024. 9. 27. 10:53

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 


 

# 클래스도 마찬가지로 버전이 달라진다고 클래스를 새로 만드는건 너무 비효율적일 것이다

 

- 클래스 템플릿 -

 

 템플릿을 적용하기 전 코드의 모습

class RandomBox
{
public:
    int GetRandomData()
    {
        int idx = rand() % 10;

        return _data[idx];
    }

public:
    int _data[10];
};

int main()
{
    srand(static_cast<unsigned int>(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;


    return 0;
}

ㆍ 난수를 뽑아주는 코드다.. 뽑히고 싶은 자료형이 float라면??? char*라면?? 하나하나 클래스를 또 만들고.. 다른버전 만들고... 하는거는 비효율적일 것 이다.

 

template<class T>
class RandomBox
{
public:
    T GetRandomData()
    {
        int idx = rand() % 10; //앤 인덱스니까

        return _data[idx];
    }

public:
    T _data[10];
};

 

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

    RandomBox<int> rb1; //지금은 형 추론이 안되니까 타입 지정

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


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


    return 0;
}

ㆍ 템플릿을 이용해서 int형 하나랑 float형 하나를 뱉게 해줬다.

 

 

 

※ 템플릿을 잘 생각해보자

ㆍ typename T를 붙이면 "조커카드" (어떤 타입이든 다 넣을 수 있다.)
ㆍ 근데 무조건 typename을 붙여야 되는 것은 아니다.
ㆍ template<>안에 들어가는건 [골라줘야 하는 목록] 이라고 볼 수 있음.

template<class T, int SIZE>
class RandomBox
{
public:
    T GetRandomData()
    {
        cout << "난 랜덤박스 일반형" << endl;
        int idx = rand() % SIZE;

        return _data[idx];
    }

public:
    T _data[10];
};

ㆍ SIZE를 받아서 SIZE만듬만 인덱스를 돌릴 수도 있다.

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

ㆍ 이런 느낌으로 사용할 수 있다!

ㆍ 함수와 다르게 10, 20 저렇게 하는 순간 클래스는 완전이 독립적인 객체가 된다.

void Hello(int n);
int main()
{
    Hello(10);
    Hello(20);
}

ㆍ 함수에선 뭐 Hello(10)이나 Hello(20)이나 같은 함수였다 하지만

rb1 = rb2;

ㆍ 10,10일 경우엔 동작 / 10,20일경우엔 오류

 

 

★ 템플릿 특수화... 더블인 경우에 특수버전 만들고싶다...

template<int SIZE>
class RandomBox<double, SIZE> // 여기에 명시해주어야 한다!!! 그냥하면 오류남
{
public:
    double GetRandomData()
    {
        cout << "난 랜덤박스 더블형" << endl;
        int idx = rand() % SIZE;

        return _data[idx];
    }

public:
    double _data[10];
};

ㆍ 클래스 옆에 double을 받는다는 것을 명시를 해 주어야 한다.

'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글

vector의 동작 원리(size / capacity)  (0) 2024.09.28
콜백함수  (0) 2024.09.27
템플릿 기초 (함수템블릿)  (0) 2024.09.27
함수객체  (0) 2024.09.27
함수포인터  (0) 2024.09.26