차근차근 꾸준히

한 눈에 알기 쉽게 정리하자

프로그래밍/C++

[C++] static에 대해서

shintesh 2024. 12. 27. 19:29

요약

  • 함수 내부: 값을 유지하며, 한 번만 초기화됨.
  • 전역 변수: 접근 범위를 파일로 제한.
  • 클래스 멤버 변수: 모든 객체가 공유하며, 클래스 자체에 속함.
  • 클래스 멤버 함수: 객체 없이 호출 가능하며, static 멤버 변수에만 접근 가능.

static은 공유, 유지, 범위 제한과 관련된 키워드라고 이해하면 된다.


1. static 변수

static으로 선언된 변수는 메모리 구조에서 데이터(Data)영역에 저장된다.

따라서, 프로그램이 시작될 때 메모리에 할당되고 프로그램이 종료될 때 해제된다.

 

일반 지역변수는 스택(Stack)영역에 저장된다.

 

 스택 영역의 변수들은 함수 호출시에 메모리에 할당되며 함수 종료시에 메모리에서 사라진다.


1.1 함수 내부에서 사용

함수 내에서 선언된 static 변수는 함수가 여러 번 호출되더라도 초기화가 단 한 번만 이루어지고, 값이 유지된다.

#include <iostream>
void counter() {
    static int count = 0; // 정적 변수
    count++;
    std::cout << "Count: " << count << std::endl;
}

int main() {
    counter(); // Count: 1
    counter(); // Count: 2
    counter(); // Count: 3
    return 0;
}

특징:

  • 함수가 호출될 때마다 새롭게 초기화되지 않는다.
  • 전역 변수처럼 값을 유지하지만, 함수 내부에만 접근 가능.

1.2 전역 변수에서 사용

전역 변수에 static을 붙이면 **변수의 접근 범위(scope)**가 제한되어 해당 파일에서만 사용할 수 있다.

static int globalVar = 10; // 이 파일 내에서만 접근 가능

특징:

  • 전역 변수의 이름 충돌을 방지하기 위해 사용.
  • 파일의 로컬 영역에서만 접근 가능(다른 파일에서 링크되지 않음).

2. static 멤버 변수 (클래스)

클래스의 static 멤버 변수는 클래스 자체에 속하며, 모든 객체가 공유한다. 객체마다 별도로 생성되지 않고 프로그램 내에서 하나만 존재한다.

#include <iostream>
class MyClass {
public:
    static int staticVar; // 선언
};

int MyClass::staticVar = 0; // 정의 및 초기화

int main() {
    MyClass obj1, obj2;
    MyClass::staticVar = 5; // 클래스 이름으로 접근
    std::cout << obj1.staticVar << std::endl; // 5
    std::cout << obj2.staticVar << std::endl; // 5
    return 0;
}

특징:

  • 모든 객체가 같은 값을 공유.
  • 객체 없이도 클래스이름::멤버로 접근 가능.
  • 반드시 클래스 외부에서 정의 및 초기화해야 함.

3. static 멤버 함수 (클래스)

static 멤버 함수는 클래스의 객체와 관계없이 호출할 수 있는 함수이다.

#include <iostream>
class MyClass {
public:
    static void staticFunction() {
        std::cout << "This is a static function." << std::endl;
    }
};

int main() {
    MyClass::staticFunction(); // 객체 없이 호출 가능
    return 0;
}

특징:

  • 객체 없이 호출 가능(클래스이름::함수).
  • static 멤버 함수는 클래스의 non-static 멤버에 접근할 수 없다.
    • 이유: 객체와 연결되지 않기 때문.

4. 클래스 내부의 static 변수 초기화

static 멤버 변수는 클래스 정의의 외부에서 한 번 초기화해야 한다.

하지만, C++17부터는 클래스 내부에서 초기화도 허용된다(단, const나 constexpr일 경우).

class MyClass {
public:
    static constexpr int value = 10; // C++17부터 가능
};

 

 

constexpr에 대해서 궁금하다면?

 

[C++] constexpr에 대해서

constexpr는 컴파일 시간에 값을 계산하도록 보장하는 키워드이다.이는 컴파일러가 상수를 미리 계산할 수 있게 하여 더 최적화된 코드를 생성하도록 돕는다.이를 사용하면 코드의 명확성과 효율

shintesh.tistory.com

 

'프로그래밍 > C++' 카테고리의 다른 글

[C++] Operator new, malloc, memset 에 대해  (0) 2025.01.15
[C++] constexpr에 대해서  (0) 2024.12.27