프로그래밍 언어/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으로 헤더 정의 가능 |
대표 활용 | 객체 수 세기, 전역 설정값, 싱글톤 패턴 등 |