C++ 멤버 함수의 정적 변수란?
멤버 함수 내부에서 정적(static) 변수는 static 키워드를 사용해 선언합니다. 정적 변수는 프로그램 실행 중 단 한 번만 메모리 공간이 할당되며, 프로그램이 종료될 때까지 해당 공간을 계속 사용합니다. 또한 전체 프로그램에서 이 변수의 복사본은 오직 하나만 존재한다는 점이 핵심 특징입니다.
즉, 클래스의 객체를 여러 개 생성하더라도 정적 변수는 모든 객체가 공유하는 단일 값만 가지게 됩니다. 이러한 성질 때문에 함수 호출 횟수 카운팅이나 상태 유지 등에 유용하게 활용됩니다.
예제 코드
다음은 C++에서 멤버 함수 내 정적 변수가 어떻게 동작하는지 보여주는 예제입니다.
#include <iostream>
using namespace std;
class Base {
public :
int func() {
static int a;
static int b = 12;
cout << "The default value of static variable a is: " << a;
cout << "\nThe value of static variable b is: " << b;
}
};
int main() {
Base b;
b.func();
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 출력이 나타납니다.
The default value of static variable a is: 0 The value of static variable b is: 12
코드 상세 분석
1. 정적 변수 선언과 초기화
Base 클래스의 멤버 함수 func() 안에는 두 개의 정적 변수 a와 b가 선언되어 있습니다. 초기화하지 않은 a는 정적 변수의 특성상 자동으로 0으로 초기화되며, b는 명시적으로 12로 초기화됩니다. 이후 두 값이 화면에 출력됩니다. 해당 코드는 아래와 같습니다.
class Base {
public :
int func() {
static int a;
static int b = 12;
cout << "The default value of static variable a is: " << a;
cout << "\nThe value of static variable b is: " << b;
}
};2. main() 함수에서의 객체 생성과 호출
main() 함수에서는 Base 클래스의 객체 b를 생성한 뒤, 멤버 함수 func()를 호출합니다. 이 과정에서 정적 변수들이 초기화되고 값이 출력됩니다.
int main() {
Base b;
b.func();
return 0;
}정리: 멤버 함수 정적 변수의 핵심 특징
- 단 한 번의 메모리 할당: 정적 변수는 프로그램 시작 시 한 번만 할당되고 종료 시까지 유지됩니다.
- 프로그램 전체에서 단일 복사본: 몇 개의 객체를 만들어도 모든 객체가 같은 변수를 공유합니다.
- 자동 0 초기화: 명시적인 초기화가 없으면 정적 변수는 기본값 0으로 초기화됩니다.
- 값의 지속성: 함수 호출이 끝나도 값이 사라지지 않으므로, 여러 번 호출 시 이전 값을 그대로 유지합니다.
이처럼 멤버 함수 내 정적 변수는 일반 지역 변수와 달리 생명 주기가 프로그램 전체에 걸쳐 있으며, 클래스의 모든 인스턴스 간에 공유된다는 점을 기억하면 됩니다.