C++에서 변수를 이해하려면 서로 다른 두 가지 개념을 구분해야 합니다.
- 범위(Scope): 이름에 접근할 수 있는 위치를 결정합니다 — 전역(global)과 지역(local)
- 저장 기간(Storage Duration): 변수가 언제 생성되고 소멸되는지를 결정합니다 — 정적(static)과 자동(auto)
범위(Scope)
지역 변수는 해당 함수나 코드 블록 내부의 문장에서만 사용할 수 있습니다. 지역 변수는 그 자체만으로는 다른 함수에서 알 수 없습니다.
예제
#include <iostream>
using namespace std;
int main () {
// 지역 변수 선언
int a, b;
int c;
// 실제 초기화
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
실행 결과는 다음과 같습니다.
출력
30
전역 변수는 모든 함수 외부, 보통 프로그램 상단에 정의됩니다. 전역 변수는 프로그램이 실행되는 동안 내내 값을 유지하며, 어떤 함수에서도 접근할 수 있습니다.
예제
#include <iostream>
using namespace std;
// 전역 변수 선언
int g;
int main () {
// 지역 변수 선언
int a, b;
// 실제 초기화
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
실행 결과는 다음과 같습니다.
출력
30
저장 기간(Storage Duration)
자동(automatic) 변수는 실행 흐름이 해당 범위를 벗어나면 수명이 끝나고, 범위에 다시 진입하면 새로 생성되는 지역 변수입니다.
예제
for (int i = 0; i < 5; ++i) {
int n = 0;
printf("%d ", ++n); // 1 1 1 1 1 출력 - 이전 값은 사라짐
}
반면 정적(static) 변수는 프로그램이 종료될 때까지 수명이 지속됩니다. 지역 변수라도 정적으로 선언하면 실행 흐름이 범위를 벗어난 후에도 값이 유지됩니다.
for (int i = 0; i < 5; ++i) {
static int n = 0;
printf("%d ", ++n); // 1 2 3 4 5 출력 - 값이 유지됨
}
주의할 점
static 키워드는 정적 저장 기간 외에도 여러 가지 의미로 사용된다는 점에 유의해야 합니다. 예를 들어 클래스 멤버 변수나 내부 연결(internal linkage) 지정 등에도 활용됩니다.
또한 C++11부터 auto 키워드는 더 이상 자동 저장 기간을 의미하지 않습니다. 현재 C++에서 auto는 변수 초기화자(initializer)로부터 타입을 자동으로 추론하는 기능을 나타냅니다.