C++ 'static' Keyword

smsh0722·2일 전

기타 정리

목록 보기
6/7

★★★static Keyword★★★

static은 변수나 함수의 Lifetime (수명), Ownership (소유 주체), Linkage (연결 범위)를 제어한다.

1. Static Variables in a Function

함수 내부 static 변수는 한 번만 생성되고 프로그램 종료까지 유지된다.

void f() {
    static int count = 0;
    count++;
}

함수가 다시 호출되어도 이전 값을 유지한다.

  • Scope (범위): 해당 블록 내부
  • Lifetime (수명): 프로그램 종료까지
  • 처음 실행될 때 한 번 생성
  • 함수가 끝나도 소멸하지 않음
  • 프로그램 종료 시 Destructor (소멸자) 호출
일반 지역 변수 → 호출마다 새로 생성
static 지역 변수 → 한 번 생성, 값 유지

상태 저장, Memoization (메모이제이션) 등에 사용된다.

2. Static Data Member in a class

Static Data Member (정적 데이터 멤버)는 객체별로 존재하지 않고 클래스 전체가 하나의 값을 공유하는 멤버 변수이다.

특징

  • 클래스 전체에 1개만 존재
  • 모든 객체가 같은 값을 공유
  • 객체가 없어도 존재
  • 프로그램 전체 실행 동안 유지
  • 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 (::, 범위 지정 연산자)를 사용한다.

C++17 inline static

C++17부터는 클래스 내부에서 바로 정의할 수 있다.

class A {
public:
    static inline int x = 10;
};

별도의

int A::x = 10;

정의가 필요 없다.

핵심

일반 멤버 변수
→ 객체마다 각각 존재

static 멤버 변수
→ 클래스 전체가 하나를 공유

예를 들어 객체 개수, 전체 사용자 수처럼 모든 인스턴스가 공유해야 하는 데이터에 사용한다.

3. Static Member Function in a class

객체가 아니라 클래스에 속하는 함수이다.

class A {
public:
    static void Print() {}
};

A::Print();

객체 없이 호출 가능하며 non-static 멤버에는 직접 접근할 수 없다.

이유는 특정 객체의 this 포인터가 없기 때문이다.

4. Global Static Variable

static int count = 0;
  • 프로그램 시작 과정에서 생성
  • 프로그램 종료 시 소멸
  • static이므로 Internal Linkage (내부 연결)를 가져 해당 Translation Unit (.cpp) 내부에서만 접근 가능
일반 global → 다른 파일에서도 extern으로 접근 가능
static global → 해당 파일 내부에서만 접근 가능

핵심 정리

위치static 의미
함수 내부값이 함수 호출 사이에 유지됨
클래스 변수모든 객체가 하나를 공유
클래스 함수객체 없이 호출 가능
전역 변수현재 파일에서만 접근 가능

★★★Static Member Function Facts★★★

Static Member Function (정적 멤버 함수)은 특정 객체가 아니라 클래스 자체에 속하는 함수이다.

1. this Pointer가 없다

class Test {
    static Test* fun() {
        return this; // Error
    }
};

static 함수는 특정 객체에 종속되지 않으므로 this Pointer (this 포인터)를 사용할 수 없다.

2. 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 (런타임 다형성)을 적용할 수 없다.

3. 동일 시그니처로 static / non-static 오버로딩 불가

static void fun();
void fun();   // Error

static 여부만으로는 Function Overloading (함수 오버로딩)을 구분할 수 없다.

4. const, volatile 지정 불가

static void fun() const; // Error

const 멤버 함수의 const는 사실상 this가 가리키는 객체를 수정하지 않겠다는 의미인데, static 함수에는 this가 없으므로 사용할 수 없다.

핵심 정리

Static Member Function
→ this 없음
→ virtual 불가
→ static/non-static만으로 Overloading 불가
→ const / volatile 불가

0개의 댓글