static과 클래스

-> static 변수의 초기화는 전역에서 진행한다.

 

static 변수는 Data 영역에 등록이 된다.

-> 프로그램 시작 시 메모리에 등록된다.

-> 사용자가 객체를 몇개 만들지 알 수 없는 상황이기 때문에

-> 컴파일러가 static 변수를 여러개 만들 수 없다.

-> 그래서, 단 하나만 메모리에 등록시킨 후 해당 클래스로 만든 모든 객체가 static 변수를 공유한다.

 

static 변수의 초기화

class CObj
{
public:
	CObj() {}
	CObj(int _a) : m_a(_a) // 불가능
	{
	}

private:
	static int m_a;

};

static 변수는 이니셜라이즈를 통해 초기화가 불가능하다.

왜냐하면 static 변수는 프로그램 시작 시 Data영역에 메모리 할당이 되고,

생성자의 호출 시점은 런타임 중 객체를 만드는 시점에 메모리에 등록이 되기 때문이다.

 

static 변수의 초기화 방법은 다음과 같다.

class CObj
{
public:
	CObj() {}
	CObj()
	{
	}

private:
	static int m_a;
};

int CObj::m_a = 10; // static 변수의 초기화

static 변수는 전역 변수로 초기화를 진행한다.

 

static 멤버 함수

-> static 멤버 함수/변수는 객체를 생성하지 않아도 접근 지정자가 public이면

static 멤버 함수/변수의 접근이 가능하고, 일반 함수/멤버 변수의 접근이 불가능하다.

 

-> 단, 일반 멤버 함수 내부에서는 static 멤버 함수/변수 접근이 가능하다.

class CObj
{
public:
	CObj() {}

	static void Static_Func()
	{
		// 멤버 함수
		Static_Func();  // 가능
		Func();         // 불가능

		// 멤버 변수
		m_StaticA = 10; // 가능
		m_a = 10;       // 불가능
	}

	void Func()
	{
		// 멤버 함수
		Static_Func();  // 가능
		Func();		// 가능

		// 멤버 변수
		m_StaticA = 10; // 가능
		m_a = 10;       // 가능
	}
private:
	static int m_StaticA;
	int m_a;
};

 

static과 const의 차이점

 

static

-> 선언을 하게 되면 위치와 상관없이 프로그램의 시작부터 끝까지 메모리에 할당되어 있고,

-> 그 값을 마음대로 바꿀 수 있다. 
-> 위치에 대해서는 전역변수든 지역변수든 상관 없다.

 

const

-> 해당 변수를 초기화한 이후에는 절대로 바꾸지 못하도록 선언하는 것

-> 초기화가 되고나면 그 이후에는 값을 바꿀 수 없게 된다.

+ Recent posts