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_var는 private으로 선언된 정적 멤버 변수입니다. 객체가 생성될 때마다 생성자가 호출되어 st_var 값이 1씩 증가합니다.
핵심은 int MyClass::st_var = 0; 부분입니다. 이처럼 클래스 외부에서 범위 지정 연산자(::)를 사용하여 초기화하면, private 멤버라 하더라도 초기화가 가능합니다. 이는 정적 멤버의 초기화가 클래스 정의의 일부가 아니라 프로그램 전역 범위에서 이루어지기 때문입니다.
또한 getStaticVar()는 정적 멤버 함수이므로 객체 없이 MyClass::getStaticVar() 형태로 직접 호출할 수 있습니다. 이를 통해 현재까지 생성된 객체의 개수를 손쉽게 확인할 수 있습니다.
참고 사항
- C++17부터는 클래스 내부에서
inline static int st_var = 0;처럼 인라인 변수(inline variable)를 사용해 정적 멤버를 선언과 동시에 초기화할 수도 있습니다. const int타입의 정적 멤버는 클래스 내부에서 바로 초기화할 수 있지만, 클래스 외부에서 정의가 필요한 경우도 있습니다.