정적(static) 객체는 static 키워드를 사용하여 선언합니다. 이러한 객체는 프로그램 실행 중 단 한 번만 초기화되며, 일반적인 스택이 아닌 정적 저장 영역(static storage area)에 저장됩니다. 정적 객체는 프로그램이 종료될 때 비로소 소멸됩니다. 즉, main() 함수가 끝난 후에도 객체는 메모리에 남아 있다가 프로그램 종료 시점에 소멸자가 호출되면서 사라집니다.
다음 예제를 통해 C++에서 정적 객체가 어떻게 동작하는지 확인해 보겠습니다.
예제 코드
#include <iostream>
using namespace std;
class Base {
public :
int func() {
int a = 20;
cout << "The value of a : " << a;
}
};
int main() {
static Base b;
b.func();
return 0;
}출력 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
The value of a : 20
코드 설명
먼저 Base 클래스 내부의 func() 함수를 살펴보겠습니다. 이 함수는 int형 변수 a를 선언하고 값 20으로 초기화한 뒤, 해당 값을 화면에 출력합니다. 관련 코드는 다음과 같습니다.
class Base {
public :
int func() {
int a = 20;
cout << "The value of a : " << a;
}
};다음으로 main() 함수에서는 Base 클래스 타입의 정적 객체 b를 생성하고, 곧바로 func() 함수를 호출합니다. 여기서 중요한 점은 객체 b가 static으로 선언되었다는 것입니다. 정적 객체는 선언된 블록(스코프)이 끝나더라도 소멸되지 않으며, 프로그램 전체가 종료되는 시점에만 소멸자가 호출됩니다. 해당 부분의 코드는 다음과 같습니다.
int main() {
static Base b;
b.func();
return 0;
}정리
정적 객체는 다음과 같은 특징을 가집니다.
- 단 한 번의 초기화: 프로그램 실행 중 처음 정의되는 시점에 딱 한 번만 생성자가 호출됩니다.
- 정적 저장 영역 할당: 스택이 아닌 데이터 영역(정적 저장소)에 저장되어 함수 호출이 반복되어도 값과 상태가 유지됩니다.
- 프로그램 종료 시 소멸: 스코프를 벗어나도 사라지지 않으며, 프로그램이 종료될 때 역순으로 소멸자가 호출됩니다.