Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 private 정적 멤버 변수를 초기화하는 방법

C++에서는 클래스 내부에 정적(static) 멤버(함수 또는 변수)를 선언할 수 있습니다. 이번 글에서는 특히 private 정적 멤버 변수를 초기화하는 방법을 알아보겠습니다.

정적 멤버 변수는 클래스의 모든 객체가 공유하는 단 하나의 복사본만 존재하기 때문에, 일반 멤버 변수처럼 생성자에서 초기화할 수 없습니다. 대신 클래스를 정의한 후, 클래스 외부에서 별도로 초기화해야 합니다.

초기화 문법은 다음과 같습니다. 먼저 클래스 이름을 쓰고, 범위 지정 연산자(::)를 붙인 뒤 변수 이름을 적고 값을 할당하면 됩니다.

클래스이름::변수이름 = 값;

아래 예제 코드는 private 정적 멤버 변수를 초기화하고 활용하는 과정을 보여줍니다.

예제 코드

#include <iostream>
using namespace std;

class MyClass {
    private:
        static int st_var; // private 정적 멤버 변수 선언

    public:
        MyClass() {
            st_var++; // 새로운 객체가 생성될 때마다 st_var 값 증가
        }

        static int getStaticVar() {
            return st_var; // 정적 멤버 함수로 st_var 값 반환
        }
};

// 클래스 외부에서 private 정적 멤버 변수 초기화
int MyClass::st_var = 0;

int main() {
    MyClass ob1, ob2, ob3; // 세 개의 객체 생성

    // 생성된 객체 수 출력
    cout << "생성된 객체 수: " << MyClass::getStaticVar() << endl;

    return 0;
}

실행 결과

생성된 객체 수: 3

코드 설명

위 예제에서 st_varprivate으로 선언된 정적 멤버 변수입니다. 객체가 생성될 때마다 생성자가 호출되어 st_var 값이 1씩 증가합니다.

핵심은 int MyClass::st_var = 0; 부분입니다. 이처럼 클래스 외부에서 범위 지정 연산자(::)를 사용하여 초기화하면, private 멤버라 하더라도 초기화가 가능합니다. 이는 정적 멤버의 초기화가 클래스 정의의 일부가 아니라 프로그램 전역 범위에서 이루어지기 때문입니다.

또한 getStaticVar()는 정적 멤버 함수이므로 객체 없이 MyClass::getStaticVar() 형태로 직접 호출할 수 있습니다. 이를 통해 현재까지 생성된 객체의 개수를 손쉽게 확인할 수 있습니다.

참고 사항

  • C++17부터는 클래스 내부에서 inline static int st_var = 0;처럼 인라인 변수(inline variable)를 사용해 정적 멤버를 선언과 동시에 초기화할 수도 있습니다.
  • const int 타입의 정적 멤버는 클래스 내부에서 바로 초기화할 수 있지만, 클래스 외부에서 정의가 필요한 경우도 있습니다.