[C++] 클래스 템플릿과 정적 변수

hwhyeons·2024년 5월 1일

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 변수는 동일하게 공유됩니다)

0개의 댓글