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

C++ 정적(static) 멤버 정의 방법 완벽 가이드

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 클래스는 점을 구성하는 두 개의 데이터 멤버 xy를 가지고 있습니다. 여기에 더해, 정적 멤버인 countPoint 클래스의 객체가 몇 개 생성되었는지 추적하는 역할을 합니다.

생성자 Point()xy의 값을 초기화하며, 동시에 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으로 초기화됩니다.
  • 클래스 외부에서 클래스명::멤버명 형태로 정의해야 합니다.
  • 객체 생성 없이도 클래스명::멤버명으로 접근 가능합니다.
  • 객체 개수 카운팅, 공통 설정값 저장 등에 유용하게 활용됩니다.