C언어에서는 프로그램 내에서 공유하는 변수나 함수를 만들기 위해 '전역'으로 선언 및 정의합니다. 하지만, C++에서 '전역'은 그다지 좋은 선택이 아닙니다. 객체지향 프로그래밍에서 어떤 클래스의 소속 없이 독립적으로 존재하는 '전역변수'나 '전역함수'는 설계상으로도 좋지않고, 불필요한 의존관계를 만들 수도 있습니다. 어떤 클래스의 소속에 있으면서 '전역'처럼 사용할 수 있도록 만들어진것이 바로 '정적(static) 멤버'입니다. 쉽게 말해, '전역변수'나 '전역함수'가 클래스 내에 들어옴으로써 최소한의 '소속'을 가지도록 했다는게 핵심입니다.

 

다음 예제는 일반적인 사용 예입니다.

class MyData {
private:
    int m_nData;
    static int m_nCount; // 정적 멤버변수 선언.(정적 멤버변수는 선언과 정의가 분리되어 있어야 합니다.)
    
public:
    MyData(int nParam) : m_nData{ nParam } { m_nCount++; }
    ~MyData() { /* do somthing */ }
    
    int GetData() const { return m_nData; }
    
    void ResetCount() { m_nCount = 0; }
    
    static int GetCount() const { return m_nCount; }
}

int MyData::m_nCount = 0; // 정적 멤버변수 정의.(정적 멤버변수는 선언과 정의가 분리되어 있어야 합니다.)

void main() {
    MyData myData{ 10 };
    
    cout << myData.GetCount() << endl;    // 인스턴스를 통해 '정적 멤버함수'를 호출합니다.
    
    cout << MyData::GetCount() < < endl;  // 클래스를 통해 '정적 멤버함수'를 호출합니다.
}