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

C++ 정적 멤버 함수로 생성된 객체 수 계산하는 방법

이 글에서는 정적(static) 멤버 함수를 사용하여 특정 클래스로부터 생성된 객체의 개수를 계산하는 방법을 알아봅니다.

정적 멤버는 객체가 아닌 클래스 자체의 속성입니다. 따라서 하나의 클래스에 대해 정적 멤버는 단 하나의 인스턴스만 존재하며, 객체를 새로 생성하더라도 정적 멤버가 추가로 만들어지지 않습니다. 모든 객체가 이 값을 공유하게 됩니다.

동작 원리

이 문제에서는 객체 수를 추적하기 위해 정적 카운터 변수를 하나 선언하고, 현재까지 생성된 객체 수를 반환하는 정적 멤버 함수도 함께 정의합니다.

새로운 객체가 생성될 때마다 생성자(constructor)가 자동으로 호출되는데, 생성자 내부에서 카운트 값을 1씩 증가시키면 프로그램이 언제든지 정확한 객체 수를 확인할 수 있습니다.

예제 코드

#include <iostream>
using namespace std;

class My_Class {
    private:
        static int count;   // 정적 카운터 변수
    public:
        My_Class() {        // 생성자에서 카운트 값 증가
            cout << "Calling Constructor" << endl;
            count++;
        }
        static int objCount() {   // 객체 수를 반환하는 정적 멤버 함수
            return count;
        }
};

// 클래스 외부에서 정적 멤버 변수 정의 (0으로 초기화)
int My_Class::count;

main() {
    My_Class my_obj1, my_obj2, my_obj3;
    int cnt;
    cnt = My_Class::objCount();   // 객체 없이 클래스 이름으로 직접 호출
    cout << "Number of objects:" << cnt;
}

실행 결과

Calling Constructor
Calling Constructor
Calling Constructor
Number of objects:3

코드 핵심 포인트

  • static int count: 클래스 레벨의 변수로, 모든 객체가 하나의 값을 공유합니다.
  • 생성자 내 count++: 객체가 생성될 때마다 자동으로 카운트가 1씩 증가합니다.
  • 정적 멤버 함수 objCount(): 객체 인스턴스 없이 My_Class::objCount()처럼 범위 해결 연산자(::)를 사용해 클래스 이름으로 직접 호출할 수 있습니다.
  • int My_Class::count; 정적 멤버 변수는 클래스 내부에서 선언만 가능하므로, 반드시 클래스 외부에서 별도로 정의(메모리 할당)해야 합니다. 정의하지 않으면 링크 오류가 발생합니다.

이 패턴은 싱글턴(Singleton) 구현, 리소스 사용량 추적, 인스턴스 제한 등 다양한 상황에서 유용하게 활용할 수 있습니다.