본문 바로가기
Language/C++

정적 멤버 변수, 함수

by W00gie 2021. 2. 15.

정적 멤버 변수란 클래스에 소속되지만 객체별로 할당되지 않고 모든 객체가 공유하는 변수이다.

모든 객체들이 공유하는 '공유 멤버'로 이해할 수 있다.

정적 멤버 변수는 static 키워드를 통해 선언된다. 예시 코드는 다음과 같다.

 

#include <stdio.h>

class Simple
{
private:
	int value;
	static int count;   //정적 멤버 변수

public:
	Simple() { count++; }
	~Simple() { count--; }
	static void InitCount() {    //정적 멤버 함수
		count = 0;
	}
	static void OutCount() {
		printf("현재 객체 개수 = %d\n", count);
	}
};
int Simple::count;

int main()
{
	Simple::InitCount();
	Simple::OutCount();
	Simple s, * ps;
	Simple::OutCount();
	ps = new Simple;
	Simple::OutCount();
	delete ps;
	Simple::OutCount();
	return 0;
}

다음 예제에서 count 변수는 생성된 전체 Simple 객체 갯수를 나타낸다. 전역변수로도 count의 역할을 수행할 수 있지만 해당 클래스에 대한 정보는 캡슐화 되어야 하기 때문에 객체지향 방식에 위배된다. 정적 멤버 변수는 객체와 논리적으로 연결되어 있지만 객체 내부에 포함되지는 않으며 개별 객체의 크기에 포함되지 않는다.

 

이러한 정적 멤버 변수는 정적멤버 함수를 통해 제어된다.

정적 멤버 함수 역시 static 키워드를 통해 선언된다.

정적 멤버 변수가 일반 멤버 함수에서 액세스가 불가능한 것은 아니지만 정적 멤버 함수가 권장된다.

정적 멤버 변수를 사용한다는 의미는 클래스 전체와 연관되는 정보일 가능성이 크기 때문이다.

 

정적 멤버 함수의 특징은 다음과 같다.

1. 객체가 생성되지 않은 상태에서도 호출 할 수 있다.

2. 호출 객체가 따로 없다. 따라서 일반 멤버 변수는 액세스가 불가능하다.

 

이러한 정적 멤버 변수들은 DB 연결이나 네트워크 접속처럼 한번 수행하는 초기화에서 그 결과를 저장하고 공유하는 식으로 활용된다. 이 외에도 게임 프로그래밍에서도 한 개의 객체를 다량 생성해 전체적인 클래스 단위에서 제어가 필요한 경우가 많은데 (몬스터 생성 수 제어) 정적 멤버를 활용해 자원을 활용할 수 있을 것으로 예상된다.

 

참고문헌 : C++ 트레이닝 김상형