C++에서 정적(static) 클래스 멤버는 static 키워드를 사용하여 정의할 수 있습니다. 클래스 내에 선언된 정적 멤버는 해당 클래스로 생성되는 모든 객체가 공유합니다. 메모리에는 정적 멤버의 복사본이 단 하나만 존재하기 때문에, 객체가 몇 개 생성되더라도 모든 객체가 동일한 멤버를 함께 사용하게 됩니다.
그렇다면 정적 멤버는 언제 초기화될까요? 정적 멤버가 다른 방식으로 명시적으로 초기화되지 않은 경우, 클래스의 첫 번째 객체가 생성되는 시점에 자동으로 0으로 초기화됩니다.
예제 코드
다음 프로그램은 C++에서 정적 클래스 멤버가 어떻게 동작하는지 보여줍니다.
#include <iostream>
using namespace std;
class Example {
public :
static int a;
int func() {
cout << "정적 멤버 a의 값: " << a;
}
};
int Example::a = 20;
int main() {
Example obj;
obj.func();
return 0;
}실행 결과
정적 멤버 a의 값: 20
코드 분석
위 프로그램을 단계별로 살펴보겠습니다.
먼저 Example 클래스 안에는 정적 멤버 변수 a가 선언되어 있으며, 멤버 함수 func()는 이 값 a를 화면에 출력하는 역할을 합니다. 여기서 주목할 부분은 클래스 외부에서 int Example::a = 20; 구문을 통해 정적 멤버를 초기화했다는 점입니다. 정적 멤버는 클래스 내부에서 선언만 하고, 반드시 클래스 외부에서 범위 지정 연산자(::)를 사용하여 정의 및 초기화해야 합니다.
class Example {
public :
static int a;
int func() {
cout << "정적 멤버 a의 값: " << a;
}
};
int Example::a = 20;이후 main() 함수에서는 Example 클래스의 객체 obj를 생성하고, func() 함수를 호출하여 정적 멤버 a의 값을 출력합니다.
int main() {
Example obj;
obj.func();
return 0;
}추가로 알아두면 좋은 점
이 예제처럼 정적 멤버를 20으로 명시적으로 초기화하면 그 값이 그대로 사용됩니다. 만약 초기화 코드가 없었다면, 첫 번째 객체가 생성될 때 a는 자동으로 0으로 초기화되었을 것입니다. 또한 정적 멤버는 객체 없이도 Example::a 형태로 직접 접근할 수 있다는 점도 기억해 두면 유용합니다.