본문 바로가기

개발/C&C++

(C/C++ 속성 정리) 26일 차 : Static이란? 및 특징

안녕하세요 넬다이입니다.

오늘은 Static에 대해서 정리를 해보겠습니다.

 

static 변수의 특징
static 은 정적인 혹은 고정된 정지 상태이며 정적인 특성을 가지고 있습니다.

전역 변수와 비슷한 특징을 가지며 공간을 할당받고 초기화가 이루어지면 프로그램이 종료될 때까지 소멸이 일어나지 않으며 재초 기화도 일어나지 않습니다.
전역 변수와는 다르게 중괄호(선언된 지역) 내부에서만 접근할 수 있습니다.

간단한 예제 소스입니다

#include <iostream>

using namespace std;

void RenderStatic(void)
{
	static int iTemp = 0;
	cout << iTemp << endl;
	++iTemp;
}

void main(void)
{
	for(int i = 0; i < 10; ++i)
	{
		RenderStatic();
	}
}

이렇게 하면은 iTemp는 선언과 동시에 초기화가 되고 재 초기화가 발생하지 않기 때문에 static int iTemp = 0 은 단 한번 들어오고 그 이후에는 들어오질 않습니다.

 

static 멤버

클래스 변수, 클래스 함수 메인 함수 호출 이전에 메모리 공간에 등록됩니다.
초기화되며 선언된 클래스 내부에 직접 접근 가능합니다.
초기화 문장을 통해서 초기화가 가능하며 생성자에서 초기화가 불가능하다.

 

간단한 예제 소스입니다.

#include <iostream>

using namespace std;

class CObj
{
public:
	//클래스 내부의 정적 멤버 변수
	static int m_iStatic;
public:
	void	Render(void)
	{
		cout << m_iStatic++ << endl;
	}
	
	//클래스 내부의 정적 멤버 함수..
	static CObj*	Create(void)
	{
		CObj*	pObj = new CObj;
		return pObj;
	}
};

//클래스 내부의 정적멤버 초기화
int CObj::m_iStatic = 10;

void main(void)
{
	CObj obj;
	obj.Render();

	CObj obj2;
	obj2.Render();

	CObj obj3;
	obj3.Render();


	CObj*	pObj = CObj::Create();

	delete pObj;
}

위에 보시면은 m_iStatic의 초기화는 클래스 외부에서 정적 멤버 초기화를 해주어야 하며

main에서 객체가 여러 개가 생성되어도 static 멤버 변수의 값이 계속해서 사라지지 않는 것을 확인할 수 있습니다.

또 한 CObj* pObj = CObj::Create(); 는 객체 생성이 없어도 클래스의 멤버 함수를 호출할 수 있습니다.