정적 데이터 멤버(static data member)는 static 키워드를 사용하여 선언된 클래스 멤버입니다. 정적 데이터 멤버의 가장 큰 특징은 객체가 몇 개 생성되더라도 클래스 전체에서 단 하나의 복사본만 존재한다는 점입니다. 모든 객체가 이 멤버를 공유하기 때문입니다. 또한 첫 번째 클래스 객체가 생성될 때 정적 데이터 멤버는 항상 0으로 초기화됩니다.
정적 데이터 멤버의 문법
정적 데이터 멤버의 선언 문법은 다음과 같습니다.
static data_type data_member_name;
위 문법에서 static 키워드가 사용되며, data_type은 int, float 등 C++ 데이터 타입을 의미하고, data_member_name은 해당 데이터 멤버에 부여할 이름입니다.
다음은 C++에서 정적 데이터 멤버가 어떻게 동작하는지 보여주는 예제 프로그램입니다.
예제 코드
#include <iostream>
#include<string.h>
using namespace std;
class Student {
private:
int rollNo;
char name[10];
int marks;
public:
static int objectCount;
Student() {
objectCount++;
}
void getdata() {
cout << "Enter roll number: "<<endl;
cin >> rollNo;
cout << "Enter name: "<<endl;
cin >> name;
cout << "Enter marks: "<<endl;
cin >> marks;
}
void putdata() {
cout<<"Roll Number = "<< rollNo <<endl;
cout<<"Name = "<< name <<endl;
cout<<"Marks = "<< marks <<endl;
cout<<endl;
}
};
int Student::objectCount = 0;
int main(void) {
Student s1;
s1.getdata();
s1.putdata();
Student s2;
s2.getdata();
s2.putdata();
Student s3;
s3.getdata();
s3.putdata();
cout << "Total objects created = " << Student::objectCount << endl;
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter roll number: 1 Enter name: Mark Enter marks: 78 Roll Number = 1 Name = Mark Marks = 78 Enter roll number: 2 Enter name: Nancy Enter marks: 55 Roll Number = 2 Name = Nancy Marks = 55 Enter roll number: 3 Enter name: Susan Enter marks: 90 Roll Number = 3 Name = Susan Marks = 90 Total objects created = 3
코드 분석
위 프로그램에서 Student 클래스는 학생의 학번(roll number), 이름(name), 점수(marks)를 나타내는 세 개의 데이터 멤버를 가지고 있습니다. 그중 objectCount는 정적 데이터 멤버로, Student 클래스로부터 생성된 객체의 총 개수를 저장합니다. 생성자 Student()는 새로운 객체가 생성될 때마다 호출되며, 호출될 때마다 objectCount 값을 1씩 증가시킵니다.
클래스에는 두 개의 멤버 함수가 정의되어 있습니다. getdata()는 사용자로부터 데이터를 입력받는 함수이고, putdata()는 입력받은 데이터를 화면에 출력하는 함수입니다. 해당 코드는 다음과 같습니다.
class Student {
private:
int rollNo;
char name[10];
int marks;
public:
static int objectCount;
Student() {
objectCount++;
}
void getdata() {
cout << "Enter roll number: "<<endl;
cin >> rollNo;
cout << "Enter name: "<<endl;
cin >> name;
cout << "Enter marks: "<<endl;
cin >> marks;
}
void putdata() {
cout<<"Roll Number = "<< rollNo <<endl;
cout<<"Name = "<< name <<endl;
cout<<"Marks = "<< marks <<endl;
cout<<endl;
}
};main() 함수에서는 Student 클래스의 세 객체 s1, s2, s3를 생성하고, 각 객체에 대해 getdata()와 putdata()를 호출합니다. 마지막으로 objectCount의 값을 출력하여 총 생성된 객체 수를 확인합니다.
int main(void) {
Student s1;
s1.getdata();
s1.putdata();
Student s2;
s2.getdata();
s2.putdata();
Student s3;
s3.getdata();
s3.putdata();
cout << "Total objects created = " << Student::objectCount << endl;
return 0;
}정리
정적 데이터 멤버는 클래스의 모든 객체가 공유하는 유일한 멤버이므로, 생성된 객체 수를 세거나 클래스 전체에 공통으로 적용되는 값을 저장할 때 매우 유용합니다. 위 예제에서처럼 Student::objectCount와 같이 클래스 이름과 범위 지정 연산자(::)를 사용하여 정적 멤버에 접근할 수 있다는 점도 기억해 두면 좋습니다.