만약 인스턴스의 총 개수를 알기 위해서는 어떤 방법을 사용해야 될까? 전역 변수를 사용하는 방법이 있겠지만 가독성과 안전성이 떨어진다. 이럴 때 전역 변수 대신 사용할 수 있는 것이 정적 멤버 변수다.
정적 멤버 변수는 각각의 인스턴스가 가지는 고유의 멤버 변수와 달리 클래스 안에 단 하나만 존재하고 모든 인스턴스가 공유한다.
정적 멤버 변수는 클래스 내부에서 선언할 때 초기화할 수 있는 멤버 변수와 달리 반드시 클래스 외부에서 초기화해야 한다. 단, 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();
}