정적 지역 변수 : Static Local Variables
개요
C++에서 함수 내부에 static
키워드를 사용하여 선언된 변수를 정적 지역 변수(Static Local Variable)라고 합니다. 이 변수는 일반적인 지역 변수와 달리, 프로그램이 시작될 때 생성되어 종료될 때까지 파괴되지 않으며, 함수 호출이 끝나도 그 값을 계속 유지합니다.
C++ 버전별 주요 키워드 도입 시기
- C++98:
static
키워드 자체는 C++ 초기 버전부터 존재했으며, 정적 지역 변수의 개념도 이때부터 사용되었습니다. - C++11: 정적 지역 변수의 초기화가 스레드에 안전(thread-safe)하도록 보장되었습니다. 여러 스레드에서 동시에 해당 함수에 접근하더라도 변수는 정확히 한 번만 초기화됩니다.
내용 설명
정적 지역 변수는 다음과 같은 주요 특징을 가집니다.
- 생명 주기(Lifetime): 프로그램 전체의 실행 시간과 동일합니다. 전역 변수처럼 프로그램이 시작될 때 메모리에 할당되고 종료될 때 해제됩니다.
- 스코프(Scope): 변수가 선언된 함수 블록 내부로 제한됩니다. 즉, 함수 외부에서는 접근할 수 없습니다.
- 초기화(Initialization): 해당 함수가 처음 호출될 때 단 한 번만 초기화됩니다. 이후 함수가 다시 호출될 때는 초기화 구문이 실행되지 않습니다.
- 값 유지: 함수 호출이 종료되어도 변수의 값은 사라지지 않고 메모리에 계속 남아있습니다. 다음 호출 시 이전에 저장된 값을 그대로 사용합니다.
예제 코드
#include <iostream>
#include <cstdint>
// 참고: 이 함수는 수학적인 팩토리얼을 올바르게 계산하지 않습니다.
// 정적 지역 변수의 동작 방식을 보여주기 위한 예제입니다.
std::uint64_t faculty(const std::uint8_t n)
{
// 'result'는 프로그램 실행 중 단 한 번 '1'로 초기화됩니다.
static auto result = std::uint64_t{1};
for (std::uint8_t i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
int main()
{
// 1. faculty(5) 첫 번째 호출
// result = 1 * (1*2*3*4*5) = 120
const auto value1 = faculty(5);
std::cout << value1 << "\n";
// 2. faculty(5) 두 번째 호출
// 이전 값 120을 유지한 상태에서 계산을 누적합니다.
// result = 120 * (1*2*3*4*5) = 14400
const auto value2 = faculty(5);
std::cout << value2 << "\n";
return 0;
}
실행 결과
120
14400
첫 번째 faculty(5)
호출 시 result
는 1
에서 시작하여 120
이 됩니다. 함수가 종료되어도 result
는 파괴되지 않고 120
이라는 값을 유지합니다. 두 번째 faculty(5)
호출 시에는 초기화가 생략되고, 120
에서 계산을 시작하여 14400
이라는 누적된 결과가 나옵니다.
활용팁
- 함수 호출 횟수 카운팅: 함수가 몇 번 호출되었는지 추적하고 싶을 때 전역 변수 대신 사용하여 코드의 오염을 막을 수 있습니다.
- 캐싱(Caching): 복잡한 연산 결과를 함수 내 정적 변수에 저장해두고, 다음 호출 시에는 저장된 값을 즉시 반환하여 성능을 향상시킬 수 있습니다. (Memoization)
- 싱글톤 패턴(Singleton Pattern): C++11부터 스레드에 안전한 초기화를 보장하므로, 특정 객체를 프로그램 전체에서 유일하게 하나만 생성해야 할 때 간단하고 안전하게 구현할 수 있습니다. (Meyers' Singleton)
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : const vs constexpr (98, 11, 14, 17, 20) (0) | 2025.08.06 |
---|---|
Modern C++ : type conversions (11, 14, 17, 20) (2) | 2025.08.05 |
Modern C++ : designated initializers (20) (0) | 2025.08.04 |
Modern C++ : enum concepts (11, 20) (1) | 2025.08.03 |
Modern C++ : enum vs enum class (98, 11) (1) | 2025.08.02 |
Modern C++ 둘러보기 (4) | 2025.08.01 |