개발 Study

#35. 클래스 템플릿

HYuk 2021. 5. 21. 15:24
728x90

#클래스에서의 템플릿

#include "stdafx.h"
#include <iostream>
using namespace std;

template <typename T>
class CLS
{
	T m_a;
public:
	CLS(T _a) { m_a = _a; }
};



void main()
{
	CLS<int> cls(10);
}

위 코드와 같이 클래스에서 템플릿을 이용해 자료형을 사용자 입맛에 맞게 설정하여 객체를 생성할 수 있다.

위처럼 템플릿클래스는 컴파일러가 코드라인을 컴파일 할 때 클래스의 원형을 만들기 때문

헤더파일만 include 할 경우 정의부 정보를 알 수가 없다.

정의부를 알 수 없기 때문에 클래스 원형을 만들 수가 없다.

또한 템플릿은 파일 분할시에 매 함수마다 template <typename T>를 명시해야하는 귀찮음이 있다.

(명시를 한다 해도 클래스 원형을 만들지 못함)

-> 따라서 템플릿은 파일분할을 하지 않는다!

 


#template에서의  static

지난 글 중 class내에서 static 멤버변수는 전역에서 초기화하고, 객체를 다르게 생성해도 static변수를 공유해서 같은 값이 나오는 것을 확인할 수 있었다.

#28. static, this, extern, 복사생성자 (tistory.com)

 

#28. static, this, extern, 복사생성자

#11. 지역변수, 전역변수 및 메모리구조 (2) (tistory.com) #11. 지역변수, 전역변수 및 메모리구조 (2) # 지역변수, 전역변수 #10. 함수 및 메모리 구조 (tistory.com) 재사용성이 좋기 때문에 자주 사용한다.

hyukee.tistory.com

하지만 template으로 했을때는 어떨까?

 

template으로 했을 때 class의 멤버변수로 static T m_A; 라고 했을 때,

객체를 다르게 생성해도 멤버변수를 공유한다는 점은 동일하지만

자료형이 같은 객체끼리만 공유하는 것을 확인 할 수 있다.

 

예를 들면

class CLS에

T m_A; 라는 멤버변수를 선언 했을 때, (여기서 T는 template <typename T>의 T이다)

객체 생성을

CLS<int> i_cls;

CLS<int> i_cls2;

CLS<float> f_cls;

 

을 한다고 하면

 

i_cls.m_A 와 i_cls2.m_A 는 같은 자료형(int) 이라, m_A의 값을 공유하지만

f_cls와는 공유하지 않는것을 찾아 볼 수 있다.

#include "stdafx.h"
#include <iostream>
using namespace std;

template <typename T>
class CLS
{
public:
	CLS() {}
	~CLS() {}

	static T	m_A;
};

template <typename T>
T CLS<T>::m_A = 0;

void main()
{
	CLS<int> i_cls;
	CLS<int> i_cls2;
	CLS<float> f_cls;

	++i_cls.m_A;
	++i_cls2.m_A;
	
	cout << "i_cls.m_A: " << i_cls.m_A << endl;
	cout << "i_cls2.m_A: " << i_cls2.m_A << endl;
	cout << "f_cls.m_A: " << f_cls.m_A << endl;
}


#템플릿 상속

클래스에서 템플릿 상속도 가능하다.

클래스명 위에 template <typename T>를 명시해주면 된다.

#include "stdafx.h"
#include <iostream>
using namespace std;

template <typename T>
class CLS
{

};

template <typename T>
class Child : public CLS<T>
{

};

void main()
{
	Child<int>	a;
}

 

728x90

'개발 Study' 카테고리의 다른 글

#37. Vector  (0) 2021.05.23
#36. STL (Standard Template Library) 정의  (0) 2021.05.22
#34. Template 및 inline  (0) 2021.05.20
#33. operator 연산자 오버로딩  (0) 2021.05.18
#32. 바인딩  (0) 2021.05.14