프로그래밍 언어/C++

C++ static - 3. 클래스에서의 static 활용 (3.1. static 멤버 변수)

개발_노트 2025. 3. 25. 20:13

 

✅ 3.1. static 멤버 변수

🔹 개념: 클래스 수준 공유 변수

  • static 멤버 변수는 클래스에 속하지만, 객체에는 속하지 않는 정적 변수입니다.
  • 클래스의 모든 객체가 하나의 동일한 변수 값을 공유합니다.
  • 객체가 여러 개 생성되더라도 해당 변수는 메모리상 한 번만 존재합니다.

📌 클래스당 하나, 모든 인스턴스가 공유 → 공용 저장소 역할


🔹 선언과 정의의 분리 (.h와 .cpp)

  • 클래스 내부에서는 static 멤버 변수의 선언만 가능
  • 실제 메모리 할당 및 초기화는 클래스 외부에서 정의해야 함
// MyClass.h
class MyClass {
public:
    static int value;  // 선언 (정의 아님)
};

// MyClass.cpp
#include "MyClass.h"
int MyClass::value = 0;  // 정의 및 초기화

⚠️ 정의가 누락되면 링커 오류(Linker Error) 발생


🔹 모든 객체가 동일한 데이터 참조

#include <iostream>

class Counter {
public:
    static int count;

    Counter() {
        count++;
    }
};

int Counter::count = 0;

int main() {
    Counter a, b, c;
    std::cout << "Total instances: " << Counter::count << std::endl;  // 출력: 3
}
  • 세 개의 객체가 모두 하나의 count 변수를 공유
  • 일반 멤버 변수였다면 객체마다 다른 값을 가졌을 것

🔹 inline static 멤버 변수 (C++17 이상)

  • C++17부터는 inline static 키워드를 사용하면 헤더 파일 안에서 정의와 초기화까지 가능합니다.
  • 여러 번 포함되더라도 중복 정의 오류가 발생하지 않음
// MyClass.h (C++17 이상)
class MyClass {
public:
    inline static int version = 1;  // 정의와 초기화 모두 가능
};

✅ 장점:

  • .cpp 파일에 정의할 필요 없음
  • 템플릿 클래스header-only 구조에 특히 유용

🔹 constexpr static 멤버 변수 (C++11 이상)

  • constexpr 키워드를 사용하면 컴파일 타임 상수로 정의 가능
  • 클래스 내부에서 선언과 동시에 초기화 가능
class Config {
public:
    constexpr static int max_users = 100;
};

✅ 장점:

  • 템플릿 인자, 배열 크기 등 컴파일 타임 상수로 사용 가능
  • 불필요한 외부 정의 생략 가능

🔹 초기화 시점과 주의사항

항목 설명
초기화 시점 static 멤버 변수는 프로그램 시작 시 정적 초기화
접근 방법 객체 없이도 클래스명::변수명 으로 접근 가능
주의사항 .h 파일에 정의할 경우 중복 정의 위험 (C++17 이전에는 반드시 .cpp에서 정의 필요)

🔹 활용 예시: 싱글톤 패턴

static 멤버 변수는 클래스 내에서 인스턴스를 하나만 유지하는 싱글톤 패턴 구현에 필수적입니다.

class Singleton {
private:
    Singleton() = default;  // 생성자 비공개
    inline static Singleton instance;  // C++17 이상

public:
    static Singleton& getInstance() {
        return instance;
    }

    void greet() {
        std::cout << "Hello from Singleton!" << std::endl;
    }
};
int main() {
    Singleton::getInstance().greet();
}

📌 클래스 외부에서 객체 생성을 막고, 내부에서 하나의 정적 인스턴스만 관리하는 구조


✅ 요약

항목 설명
정의 클래스에 속하고, 객체와 무관한 공유 변수
공유 범위 클래스의 모든 인스턴스가 동일한 변수 공유
선언 위치 클래스 내부 (헤더)
정의 위치 클래스 외부 (.cpp) — 단, C++17부터는 inline static으로 헤더 정의 가능
초기화 시점 프로그램 시작 시 정적 초기화
C++11 특징 constexpr static으로 컴파일 타임 상수 정의 가능
C++17 특징 inline static으로 헤더 정의 가능
대표 활용 객체 수 세기, 전역 설정값, 싱글톤 패턴 등