클래스의 인스턴스가 아닌 클래스 자체에 귀속되는 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) 구현이나 상수 관리, 유틸리티 함수 모음 등에 널리 활용되는 것 같다.