만약 인스턴스의 총 개수를 알기 위해서는 어떤 방법을 사용해야 될까? 전역 변수를 사용하는 방법이 있겠지만 가독성과 안전성이 떨어진다. 이럴 때 전역 변수 대신 사용할 수 있는 것이 정적 멤버 변수다.
정적 멤버 변수는 각각의 인스턴스가 가지는 고유의 멤버 변수와 달리 클래스 안에 단 하나만 존재하고 모든 인스턴스가 공유한다.
정적 멤버 변수는 클래스 내부에서 선언할 때 초기화할 수 있는 멤버 변수와 달리 반드시 클래스 외부에서 초기화해야 한다. 단, const static
변수는 예외적으로 클래스 내부에서 초기화가 가능하다.
class Test {
private:
// static int a = 0; 불가능
static int a;
const static int b = 0; // 가능
public:
Test() { a++; } // 생성 시 1 증가
~Test() { a--; } // 소멸 시 1 감소
};
int Test::a = 0; // 클래스 외부에서 초기화
일반 멤버 함수 앞에 static
을 붙이면 정적 멤버 함수가 된다.
정적 멤버 함수는 정적 멤버 변수와 마찬가지로 각각의 객체가 아닌 클래스에 종속되는 것이므로 일반 멤버 함수와 다르게 아래의 방식으로 호출해야 된다.
(객체).(멤버 함수) // 일반 멤버 함수 (클래스)::(정적 멤버 함수) // 정적 멤버 함수
정적 멤버 함수 내에서 일반 멤버 변수를 다루게 되면 어느 객체의 변수인지 알 수 없으므로 정적 멤버 함수 내에서는 정적 멤버 변수만 다룰 수 있다.
#include <iostream>
using namespace std;
class Test {
private:
static int num; // 정적 멤버 변수
public:
Test() { num++; } // 생성 시 1 증가
~Test() { num--; } // 소멸 시 1 감소
static void ShowNum(); // 정적 멤버 함수
};
int Test::num = 0; // 클래스 외부에서 초기화
void Test::ShowNum() { cout << num << endl; }
int main() {
Test t;
Test::ShowNum();
}