※ 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 |