C++에서 클래스의 정적(static) 멤버는 static 키워드를 사용하여 정의합니다. 정적 클래스 멤버는 해당 클래스의 객체가 몇 개 생성되더라도 메모리에는 단 하나의 복사본만 존재합니다. 따라서 정적 멤버는 그 클래스의 모든 객체가 함께 공유하게 됩니다.
또한 정적 멤버가 다른 방식으로 초기화되지 않은 경우, 클래스의 첫 번째 객체가 생성되는 시점에 자동으로 0으로 초기화됩니다.
아래 프로그램은 정적 클래스 멤버를 정의하고 사용하는 방법을 보여줍니다.
예제 코드
#include <iostream>
using namespace std;
class Point{
int x;
int y;
public:
static int count;
Point(int x1, int y1){
x = x1;
y = y1;
count++;
}
void display(){
cout<<"The point is ("<<x<<","<<y<<")\n";
}
};
int Point::count = 0;
int main(void){
Point p1(10,5);
Point p2(7,9);
Point p3(1,2);
p1.display();
p2.display();
p3.display();
cout<<"\nThe number of objects are: "<<Point::count;
return 0;
}실행 결과
The point is (10,5) The point is (7,9) The point is (1,2) The number of objects are: 3
코드 상세 설명
클래스 정의 부분
Point 클래스는 점을 구성하는 두 개의 데이터 멤버 x와 y를 가지고 있습니다. 여기에 더해, 정적 멤버인 count는 Point 클래스의 객체가 몇 개 생성되었는지 추적하는 역할을 합니다.
생성자 Point()는 x와 y의 값을 초기화하며, 동시에 count 값을 1씩 증가시켜 객체 생성 횟수를 기록합니다. display() 함수는 좌표 값을 화면에 출력합니다.
주목할 부분은 클래스 외부에서 int Point::count = 0; 구문을 통해 정적 멤버를 초기화했다는 점입니다. C++에서 정적 데이터 멤버는 클래스 내부에서 선언만 하고, 반드시 클래스 외부에서 범위 지정 연산자(::)를 사용하여 정의·초기화해야 합니다.
class Point{
int x;
int y;
public:
static int count;
Point(int x1, int y1){
x = x1;
y = y1;
count++;
}
void display(){
cout<<"The point is ("<<x<<","<<y<<")\n";
}
};main() 함수 부분
main() 함수에서는 Point 클래스의 객체 3개(p1, p2, p3)를 생성합니다. 각 객체가 생성될 때마다 생성자가 호출되어 count 값이 증가합니다.
이후 display() 함수를 호출해 각 객체의 좌표를 출력하고, 마지막으로 Point::count를 통해 현재까지 생성된 객체의 총 개수를 출력합니다. 정적 멤버는 객체 이름이 아닌 클래스 이름과 범위 지정 연산자로 직접 접근할 수 있다는 점도 확인할 수 있습니다.
Point p1(10,5); Point p2(7,9); Point p3(1,2); p1.display(); p2.display(); p3.display(); cout<<"\nThe number of objects are: "<<Point::count;
정적 멤버의 핵심 특징 정리
- 모든 객체가 하나의 복사본을 공유합니다.
- 별도 초기화가 없으면 첫 객체 생성 시 0으로 초기화됩니다.
- 클래스 외부에서
클래스명::멤버명형태로 정의해야 합니다. - 객체 생성 없이도
클래스명::멤버명으로 접근 가능합니다. - 객체 개수 카운팅, 공통 설정값 저장 등에 유용하게 활용됩니다.