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

C++ 정적 데이터 멤버(Static Data Member) 완벽 이해하기

정적 데이터 멤버(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와 같이 클래스 이름과 범위 지정 연산자(::)를 사용하여 정적 멤버에 접근할 수 있다는 점도 기억해 두면 좋습니다.