문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT 기록장] C++ - 템플릿과 static (함수 템플릿과 static 지역 변수, 클래스 템플릿과 static 맴버변수, template<typename T>, template<> 사용 상황, 템플릿 static 맴버변수 초기화의 특수화)

벼리네 2021. 6. 30. 15:39
반응형

[문과 코린이의 IT 기록장] C++ - 템플릿과 static (함수 템플릿과 static 지역 변수, 클래스 템플릿과 static 맴버변수, template<typename T>, template<> 사용 상황, 템플릿 static 맴버변수 초기화의 특수화)

[문과 코린이의 IT 기록장] C++ - 템플릿과 static (함수 템플릿과 static 지역 변수, 클래스 템플릿과 static 맴버변수, template<typename T>, template<> 사용 상황, 템플릿 static 맴버변수 초기화의 특수화)

 


[ 클래스 템플릿에 대한 이전 포스팅 ]

2021.06.29 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C,C++ - 템플릿(Template)에 대한 이해와 함수 템플릿 (함수를 대상으로 템플릿 이해하기, 함수 템플릿과 템플릿 함수, 둘 이상의 형(Type)에 대해 템플릿 선언하기, 함수 ..

 

[문과 코린이의 IT 기록장] C,C++ - 템플릿(Template)에 대한 이해와 함수 템플릿 (함수를 대상으로 템

[문과 코린이의 IT 기록장] C,C++ - 템플릿(Template)에 대한 이해와 함수 템플릿 (함수를 대상으로 템플릿 이해하기, 함수 템플릿과 템플릿 함수, 둘 이상의 형(Type)에 대해 템플릿 

vansoft1215.tistory.com

2021.06.29 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (클래스 템플릿의 정의, 클래스 템플릿의 선언과 정의의 분리, 배열 클래스의 템플릿화)

 

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (클래스 템플릿의 정의, 클래스 템플릿

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (클래스 템플릿의 정의, 클래스 템플릿의 선언과 정의의 분리, 배열 클래스의 템플릿화) 1. 클래스 템플릿의 정의 [문과

vansoft1215.tistory.com

2021.06.30 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (Point 클래스 템플릿과 배열 클래스 템플릿, 특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와, friend 선언)

 

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (Point 클래스 템플릿과 배열 클래스 템

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (Point 클래스 템플릿과 배열 클래스 템플릿, 특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와, friend 선..

vansoft1215.tistory.com

2021.06.30 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 클래스 템플릿의 특수화(Class Template Specialization) (클래스 템플릿 특수화, 클래스 템플릿의 부분 특수화)

 

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿의 특수화(Class Template Specialization) (클래스 템플릿

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿의 특수화(Class Template Specialization) (클래스 템플릿 특수화, 클래스 템플릿의 부분 특수화) [ 클래스 템플릿에 대한 이전 포스팅 ] 2021.0..

vansoft1215.tistory.com

2021.06.30 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 템플릿 인자 (템플릿 매개변수의 변수 선언, 템플릿 매개변수에 디폴트 값 지정)

 

[문과 코린이의 IT 기록장] C++ - 템플릿 인자 (템플릿 매개변수의 변수 선언, 템플릿 매개변수에

[문과 코린이의 IT 기록장] C++ - 템플릿 인자 (템플릿 매개변수의 변수 선언, 템플릿 매개변수에 디폴트 값 지정) [ 클래스 템플릿에 대한 이전 포스팅 ] 2021.06.29 - [문과 코린이의, [C. C+

vansoft1215.tistory.com

 


1. 함수 템플릿과 static 지역 변수

 * static에 대해 좀 더 참고하고 싶다면?

 

[문과 코린이의 IT 기록장] C,C++ - static (static이란?, static 맴버 변수, static 맴버변수의 또 다른 접근

[문과 코린이의 IT 기록장] C,C++ - static (static이란?, static 맴버 변수, static 맴버변수의 또 다른 접근방법, static 맴버함수, const static 맴버)  1. static이란? : static변수는..

vansoft1215.tistory.com

 

ex 1 ) 함수 템플릿 - static 활용

template <typename T>
void ShowStaticValue() {
	static T num = 0; // 지역변수 num이 static으로 선언됨
	num += 1;
	cout << num << " ";
}

 

ex 2 ) 템플릿 함수들과 static

void ShowStaticValue<int>() {
	static int num = 0; // static 지역변수는 템플릿 함수 별로 각각 존재하게 된다.
	num += 1;
	cout << num << " ";
}

void ShowStaticValue<long>() {
	static int num = 0; // static 지역변수는 템플릿 함수 별로 각각 존재하게 된다.
	num += 1;
	cout << num << " ";
}

Case 1 )

#include<iostream>
using namespace std;

// 함수 템플릿
template <typename T>
void ShowStaticValue() {
	static T num = 0;
	num += 1;
	cout << num << " ";
}

int main() {
	ShowStaticValue<int>();
	ShowStaticValue<int>();
	ShowStaticValue<int>();
	cout << endl;

	ShowStaticValue<long>();
	ShowStaticValue<long>();
	ShowStaticValue<long>();
	cout << endl;

	ShowStaticValue<double>();
	ShowStaticValue<double>();
	ShowStaticValue<double>();

	return 0;
}

 

결과값을 보면, 실행되는 컴파일러에 의해서 만들어진 템플릿 함수별로 static 지역변수가 유지되는 것을 알 수 있다.

 

 


2. 클래스 템플릿과 static 맴버변수

ex 1 ) 클래스 템플릿 - static

template <typename T>
class SimpleStaticMem {
private:
	static T mem;
public:
	void AddMem(int num) { mem += num; }
	void Showmem() { cout << mem << endl; }
};

template <typename T>
T SimpleStaticMem<T>::mem = 0; // 템플릿 기반의 static 맴버 초기화 문장

ex 2 ) 컴파일러에 의한 템플릿 클래스들과 static

// <int>
class SimpleStaticMem<int> {
private:
	static int mem;
public:
	void AddMem(int num) { mem += num; }
	void ShowMem() { cout << mem << endl; }
};
int SimpleStaticMem<int>::mem = 0;

// <double>
class SimpleStaticMem < double > {
private:
	static double mem;
public:
	void AddMem(double num) { mem += num; }
	void ShowMem() { cout << mem << endl; }
};
double SimpleStaticMem<double>::mem = 0;

 

# 템플릿 클래스 별로 static 맴버변수를 유지하게 된다.

 

 


Case 2 )

#include<iostream>
using namespace std;

template <typename T>
class SimpleStaticMem {
private:
	static T mem;
public:
	void AddMem(int num) { mem += num; }
	void Showmem() { cout << mem << endl; }
};

template <typename T>
T SimpleStaticMem<T>::mem = 0; // 템플릿 기반의 static 맴버 초기화 문장



int main() {
	// obj1,obj2는 같은 템플릿 클래스를 활용하므로, static 맴버변수 공유
	SimpleStaticMem<int>obj1;
	SimpleStaticMem<int>obj2;
	obj1.AddMem(2);
	obj2.AddMem(3);
	obj1.Showmem();

	// obj3, obj4는 같은 템플릿 클래스를 활용하므로, static 맴버변수 공유
	SimpleStaticMem<long>obj3;
	SimpleStaticMem<long>obj4;
	obj3.AddMem(100);
	obj4.Showmem();

	return 0;
}

 


3. template<typename T>, template<> 사용 상황

템플릿 관련 정의에는 template<typename T> 또는 template<>와 같은 선언을 둬서, 템플릿의 일부 또는 전부를 정의하고 있다는 사실을 컴파일러에게 알려야 한다.

 

- template<typename T> 선언 : 정의 부분에 T에 관한 내용이 들어가면 사용

template <typename T>
class SoSimple{
public:
	T SimpleFunc(T num) {...}
}

- template<> 선언 : 정의 부분에 T가 들어가지 않으면 사용

// 위의 클래스 템플릿을 특수화 한 경우
template<>
class SoSimple<int>{
public:
	int SimpleFunc(int num) { ... }
}

 

 


4. 템플릿 static 맴버변수 초기화의 특수화

앞의 예시에서 클래스 내부에서 static 맴버를 초기화 하는 방법은 이러했다.

// 클래스 static맴버변수 초기화 방법
template <typename T>
T SimpleStaticMem<T>::mem=0;

이 경우는 SimpleStaticMem<int>, SimpleStaticMem<double> ... 모두 0으로 초기화 시킨다.

 

그렇다면 만약 SimpleStaticMMem<long>만 0이 아닌, 5로 초기화하고 싶다면 어떻게 해야하는가?

template<>
long SimpleStaticMem<long>::mem=5;

이와 같이 특수화를 진행해 주면 된다.

 

즉, 특수화는 함수 템플릿, 클래스 템플릿만이 아닌, 그 클래스 내부(정의)부분에 있는 초기화문을 대상으로도 할 수 있다는 것이다.

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형