Programming Language/C++

[C++] 30.Unmanaged Programming: static 키워드

coco_daddy 2024. 1. 31. 00:26

1. 정적 변수

1.1 멤버 함수 내부에서의 정적 변수

멤버 함수 내부에서 정적 변수를 사용할 수 있다.

class Example {
public:
    void MemberFunction() {
        static int staticVar = 0;
        // 멤버 함수 내에서의 정적 변수 사용
    }
};

1.2 멤버가 아닌 함수 내부에서의 정적 변수

멤버가 아닌 함수 내에서도 정적 변수를 활용할 수 있다.

void NonMemberFunction() {
    static int staticVar = 0;
    // 멤버가 아닌 함수 내에서의 정적 변수 사용
}

2. 정적 멤버 함수

class Example {
public:
    static void StaticMemberFunction() {
        // 정적 멤버 함수
    }
};

 


3. 범위(scope)의 제한을 받는 전역 변수

전역 변수를 정의할 때 범위에 주의해야 합니다. 다양한 범위에서의 변수의 사용을 고려해야 한다.

  • 파일 속
  • 네임스페이스 속
  • 클래스 속
  • 함수 속

4. extern 키워드

extern 키워드를 사용하여 다른 파일의 전역 변수에 접근이 가능하게 할 수 있다.


5. 함수 속 정적 변수

함수 속에서 정적 변수를 사용하여 범위를 제한할 수 있다.

void Accumulate(int number) {
    static int result = 0;
    result += number;
    std::cout << "result = " << result << std::endl;
}

int main() {
    Accumulate(10); // 10
    Accumulate(20); // 30
    return 0;
}

6. 정적 멤버 변수

class Cat {
public:
    Cat();
private:
    static int count;
};

// Cat.cpp
int Cat::count = 0;

Cat::Cat() {
    count++;
}
  • 각 클래스당 하나의 COPY만 존재한다.
  • 개체의 메모리 레이아웃의 일부가 아니다.
  • 클래스 메모리 레이아웃에 포함된다.
  • exe 파일 안에 필요한 메모리가 이미 할당된다.
    • 컴파일러는 이 변수의 인스턴스가 몇 개 존재하는지 이미 알고 있다.
  • 정적 멤버 변수를 사용할 때 범위를 제한하여 사용하는 것이 좋다.
    • 함수 안에서 정적 변수를 넣지 않을 것.
    • 전역 변수 대신 정적 멤버변수를 쓸 것.
    • C스타일의 정적 변수를 써야할 이유가 없다.

7. 정적 멤버 함수

// Math.h

class Math {
public:
    static int Square(int number);
};

// Math.cpp

int Math::Square(int number) {
    return number * number;
}
  • 논리적인 범위에 제한된 전역 함수
  • 해당 클래스의 정적 멤버에만 접근 가능
  • 개체 없이도 정적 함수 호출 가능