static Keyword★★★static은 변수나 함수의 Lifetime (수명), Ownership (소유 주체), Linkage (연결 범위)를 제어한다.
함수 내부 static 변수는 한 번만 생성되고 프로그램 종료까지 유지된다.
void f() {
static int count = 0;
count++;
}
함수가 다시 호출되어도 이전 값을 유지한다.
일반 지역 변수 → 호출마다 새로 생성
static 지역 변수 → 한 번 생성, 값 유지
상태 저장, Memoization (메모이제이션) 등에 사용된다.
Static Data Member (정적 데이터 멤버)는 객체별로 존재하지 않고 클래스 전체가 하나의 값을 공유하는 멤버 변수이다.
public, private, protected 적용 가능class A {
public:
static int x;
};
int A::x = 0;
클래스 내부에서는 Declaration (선언)만 하고, 일반적으로 클래스 외부에서 Definition (정의)해야 한다.
A::x; // 클래스 이름으로 접근
A obj;
obj.x; // 객체로도 접근 가능
보통 A::x처럼 Scope Resolution Operator (::, 범위 지정 연산자)를 사용한다.
inline staticC++17부터는 클래스 내부에서 바로 정의할 수 있다.
class A {
public:
static inline int x = 10;
};
별도의
int A::x = 10;
정의가 필요 없다.
일반 멤버 변수
→ 객체마다 각각 존재
static 멤버 변수
→ 클래스 전체가 하나를 공유
예를 들어 객체 개수, 전체 사용자 수처럼 모든 인스턴스가 공유해야 하는 데이터에 사용한다.
객체가 아니라 클래스에 속하는 함수이다.
class A {
public:
static void Print() {}
};
A::Print();
객체 없이 호출 가능하며 non-static 멤버에는 직접 접근할 수 없다.
이유는 특정 객체의 this 포인터가 없기 때문이다.
static int count = 0;
static이므로 Internal Linkage (내부 연결)를 가져 해당 Translation Unit (.cpp) 내부에서만 접근 가능일반 global → 다른 파일에서도 extern으로 접근 가능
static global → 해당 파일 내부에서만 접근 가능
| 위치 | static 의미 |
|---|---|
| 함수 내부 | 값이 함수 호출 사이에 유지됨 |
| 클래스 변수 | 모든 객체가 하나를 공유 |
| 클래스 함수 | 객체 없이 호출 가능 |
| 전역 변수 | 현재 파일에서만 접근 가능 |
Static Member Function (정적 멤버 함수)은 특정 객체가 아니라 클래스 자체에 속하는 함수이다.
this Pointer가 없다class Test {
static Test* fun() {
return this; // Error
}
};
static 함수는 특정 객체에 종속되지 않으므로 this Pointer (this 포인터)를 사용할 수 없다.
virtual 불가능static virtual void fun(); // Error
virtual 함수는 객체의 런타임 타입에 따라 호출 대상을 결정하지만, static 함수는 객체에 속하지 않고 클래스 자체에 속하므로 Virtual Function (가상 함수)이 될 수 없다.
class Base {
public:
static void Func() {
cout << "Base\n";
}
};
Derived에 Func 없음 → Base의 static Func 상속해서 사용
Derived에 같은 Func 있음
→ Base::Func와 Derived::Func는 별개
→ Override가 아니라 Hiding
반면 Virtual Function (가상 함수)은 객체의 실제 타입에 따라 어떤 함수를 호출할지 결정한다.
Base* p = new Derived();
p->fun(); // 실제 객체에 따라 호출
즉:
virtual → 객체(instance) 기반
static → 클래스(class) 기반
static 함수에는 this Pointer (this 포인터)도 없기 때문에 객체 기반의 Runtime Polymorphism (런타임 다형성)을 적용할 수 없다.
static void fun();
void fun(); // Error
static 여부만으로는 Function Overloading (함수 오버로딩)을 구분할 수 없다.
const, volatile 지정 불가static void fun() const; // Error
const 멤버 함수의 const는 사실상 this가 가리키는 객체를 수정하지 않겠다는 의미인데, static 함수에는 this가 없으므로 사용할 수 없다.
Static Member Function
→ this 없음
→ virtual 불가
→ static/non-static만으로 Overloading 불가
→ const / volatile 불가