[C++] 클래스의 static 멤버 변수


Static 멤버 변수


클래스에서 사용할 수 있는 일반적인 멤버 변수와 달리,

static 멤버 변수는 모든 객체 내에 있는 같은 변수의 값을 공유시킬 수 있다.

같은 객체를 아무리 생성하더라도 모든 객체가 공유하는 메모리 딱 1개만 만들어지게 된다.

이 멤버변수는 반드시 클래스 외부에 따로 선언해주어야 한다.

클래스 밑에 선언 방식을 적어두었다.

이 static 멤버변수는 프로그램을 종료할 때 까지 메모리를 차지한다.

class CStatic
{
public:
	CStatic()
	{

	}

	~CStatic()
	{

	}

public:
	int	m_A;
	static int	m_B;

public:
	void Output()
	{
		std::cout << "A : " << m_A << std::endl;
		std::cout << "B : " << m_B << std::endl;
	}

	static void OutputStatic()
	{
		// 이 함수 내부에선 this 포인터 사용이 불가능하다.
		// 그래서 static 멤버변수만 사용이 가능하다.
		// std::cout << "A : " << m_A << std::endl; // 사용불가
		std::cout << "B : " << m_B << std::endl; // 사용가능
	}
};

// static 멤버변수는 선언부분이 별도로 클래스의 외부에 필요하다.
int	CStatic::m_B = 0;

예시 클래스를 하나 들어서 위와 같이 int CStatic::m_B에 있는 것처럼 사용이 가능하다.

이 코드에서는 m_A는 일반 멤버변수, m_B는 Static 멤버 변수이다.

int main()
{
	CStatic st1, st2, st3;

	st1.m_A = 100;
	st2.m_A = 200;
	st3.m_A = 300;

	st1.m_B = 100;
	st2.m_B = 200;
	st3.m_B = 300;

	std::cout << "st1 A 결과 : " << st1.m_A << std::endl; // 100
	std::cout << "st2 A 결과 : " << st2.m_A << std::endl; // 200
	std::cout << "st3 A 결과 : " << st3.m_A << std::endl; // 300

	std::cout << "st1 B 결과 : " << st1.m_B << std::endl; // 300
	std::cout << "st2 B 결과 : " << st2.m_B << std::endl; // 300
	std::cout << "st3 B 결과 : " << st3.m_B << std::endl; // 300


	CStatic::m_B = 400;
	CStatic::OutputStatic(); // 400


	return 0;
}

main 함수를 이렇게 만들어주고 출력을 진행한다면 출력 결과는 아래와 같이 나타난다.

st1 A 결과 : 100
st2 A 결과 : 200
st3 A 결과 : 300
st1 B 결과 : 300
st2 B 결과 : 300
st3 B 결과 : 300
B : 400

A 변수는 각자 객체가 서로 다른 값을 가지지만,

B 변수는 같은 종류의 객체끼리는 같은 메모리를 공유하고 있기 때문에 한 객체에서 B값을 바꾼다면 나머지 모든 객체에 있는 B의 값도 바뀌게 된다.

따라서 B는 100, 200은 출력되지 않고 마지막에 입력된 300만이 출력된 것이다.

Static 멤버 함수


	static void OutputStatic()
	{
		// 이 함수 내부에선 this 포인터 사용이 불가능하다.
		// 그래서 static 멤버변수만 사용이 가능하다.
		// std::cout << "A : " << m_A << std::endl; // 사용불가
		std::cout << "B : " << m_B << std::endl; // 사용가능
	}

이런 함수가 있는 것도 보았다. 이런 종류의 함수를 보고 static 멤버 함수라고 한다.

CStatic::OutputStatic();

위와 같은 형식으로 사용할 수 있다.

마치 출력할 때 std::cout 을 이용하는 것 처럼.

Static 멤버 함수의 특징은 함수 내에 사용하는 변수는 일반 멤버 변수는 사용할 수 없고, 오직 Staitc 멤버 변수만을 사용할 수 있다.

따라서 위의 코드에 있는 m_A변수는 사용이 불가능하고,
Static 변수인 m_B함수만이 사용이 가능하다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2