C++ static 멤버 이해

클래스의 인스턴스가 아닌 클래스 자체에 귀속되는 static 멤버는 모든 객체가 공유하는 데이터를 관리하거나, 객체 생성 없이 호출 가능한 유틸리티 함수를 정의할 때 사용한다.

정적 멤버 변수 (Static Member Variables)

정적 멤버 변수는 클래스의 모든 인스턴스가 공유하는 변수다.

프로그램 시작 시 메모리에 할당되며, 클래스 외부에서 반드시 초기화해야 한다.

#include <iostream>

class Counter {
public:
    // 정적 멤버 변수 선언
    static int count;

    Counter() {
        count++; // 객체가 생성될 때마다 증가
    }
};

// 클래스 외부에서 정적 멤버 변수 초기화
int Counter::count = 0;

int main() {
    Counter c1;
    Counter c2;
    Counter c3;

    // 모든 객체가 동일한 count 값을 공유함
    std::cout << "Total objects: " << Counter::count << std::endl; // 출력: 3
    return 0;
}

정적 멤버 함수 (Static Member Functions)

정적 멤버 함수는 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있다.

이 함수 내부에서는 this 포인터를 사용할 수 없으며, 오직 정적 멤버 변수나 다른 정적 멤버 함수만 호출 가능하다.

class MathUtils {
public:
    static int add(int a, int b) {
        return a + b;
    }

    static double multiply(double a, double b) {
        return a * b;
    }
};

int main() {
    // 객체 생성 없이 클래스 이름으로 직접 호출
    int sum = MathUtils::add(10, 20);
    double product = MathUtils::multiply(5.5, 2.0);

    return 0;
}

주요 특징 및 주의사항

  • 공유 자원: 특정 객체의 상태와 무관한 공통 데이터를 저장하는 데 적합하다.
  • 생명 주기: 프로그램 실행 시 생성되고 종료 시 소멸하므로, 객체의 생명 주기와 무관하게 데이터를 유지할 수 있다.
  • 접근 제한: 정적 멤버 함수는 인스턴스 멤버 변수(객체마다 다른 값을 가지는 변수)에 접근할 수 없다.
    인스턴스 멤버에 접근하려면 객체의 참조나 포인터를 인자로 전달받아야 한다.

P.S

static 키워드는 클래스 단위의 공통 기능을 설계할 때 필수적이다.

싱글톤 패턴(Singleton Pattern) 구현이나 상수 관리, 유틸리티 함수 모음 등에 널리 활용되는 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts