Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 멤버 함수 내 정적 변수, 동작 원리 제대로 이해하기

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() 안에는 두 개의 정적 변수 ab가 선언되어 있습니다. 초기화하지 않은 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으로 초기화됩니다.
  • 값의 지속성: 함수 호출이 끝나도 값이 사라지지 않으므로, 여러 번 호출 시 이전 값을 그대로 유지합니다.

이처럼 멤버 함수 내 정적 변수는 일반 지역 변수와 달리 생명 주기가 프로그램 전체에 걸쳐 있으며, 클래스의 모든 인스턴스 간에 공유된다는 점을 기억하면 됩니다.