C++에서 제공하는 class template은 일반화 프로그래밍을 제공합니다.
static 변수는, 동일한 클래스 내부에서 동일한 변수를 서로 공유합니다.
그러면, static 변수는 같은 클래스지만, 템플릿 타입이 다를 때
변수를 공유할 수 있을까 궁금해서 실험해봤습니다.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class TemplateClass {
public:
T data;
static int num;
void print_num() {
cout << TemplateClass<T>::num << "\n";
}
};
template<> int TemplateClass<string>::num = 10;
template<> int TemplateClass<int>::num = 20;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout << "기본 값\n";
cout << TemplateClass<string>::num << "\n";
cout << TemplateClass<int>::num << "\n";
TemplateClass<string> t1;
TemplateClass<int> t2;
TemplateClass<int> t3;
t1.print_num();
t2.print_num();
t3.print_num();
cout << "값 수정 후\n";
t2.num = 77;
cout << "멤버1 : ";
t1.print_num();
cout << "멤버2 : ";
t2.print_num();
cout << "멤버3 : ";
t3.print_num();
return 0;
}
위와 같은 코드에서, t1은 string타입, t2,t3는 int타입을 가지게 됩니다.
출력 결과는
기본 값
10
20
10
20
20
값 수정 후
멤버1 : 10
멤버2 : 77
멤버3 : 77
으로 결과가 출력됩니다.
여기서, 중간에 t2.num =77로, static 변수의 값을 수정한건 t2뿐이지만,
t1은 변하지 않지만 t3는 값이 변하는 것을 확인할 수 있습니다.
이를 통해 t2, t3는 서로 다른 객체지만 static 변수를 서로 공유하는 것을
확인할 수 있고, t1은 t2-t3와 static 변수를 공유하지 않음을 확인할 수 있습니다.
이유
이런 결과가 나오는 이유는, c++에서 Template Class는
타입에 따라 클래스 코드가 생성되기 때문입니다.
C++ Insights에 접속해서
작성한 코드를 집어넣고 변환해봤습니다.


그 결과, 위 두 사진처럼,
class TemplateClass<int>
class TemplateClass<std::basic_string<char>>
이렇게 두개의 클래스가 같은 코드로 두번 생성 되는 것을 확인할 수 있습니다.
즉, 템플릿으로 코드를 재사용 했지만, 실제 코드는 타입에 따라 클래스를
여러개 생성하게 됩니다.
Java언어의 제네릭과 C++의 클래스 템플릿이 처음에는 매우 비슷하다고
생각했지만, 자세히 알면 알수록 크게 다른 부분들이 많은 것 같습니다.
(Java에서는 제네릭 타입이 달라도 static 변수는 동일하게 공유됩니다)