변수 범위(scope)란 프로그램 내에서 변수가 유효하게 사용될 수 있는 영역을 의미합니다. C++에서는 크게 세 가지 위치에 변수를 선언할 수 있습니다.
함수 또는 블록 내부 — 지역 변수(local variable)
함수 매개변수 정의 부분 — 형식 매개변수(formal parameter)
모든 함수 외부 — 전역 변수(global variable)
함수와 매개변수에 대한 자세한 내용은 이후 장에서 다룰 예정이며, 여기서는 지역 변수와 전역 변수의 개념과 차이점을 중점적으로 설명하겠습니다.
지역 변수(Local Variables)
함수나 블록 내부에서 선언된 변수를 지역 변수라고 합니다. 지역 변수는 해당 함수나 코드 블록 내부의 문장에서만 사용할 수 있으며, 외부의 다른 함수에서는 접근할 수 없습니다. 즉, 지역 변수는 자신이 속한 범위를 벗어나면 존재하지 않는 것과 마찬가지입니다.
예제
#include <iostream>
using namespace std;
int main () {
// 지역 변수 선언
int a, b;
int c;
// 실제 초기화
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}위 예제에서 a, b, c는 모두 main() 함수 내부에 선언된 지역 변수이므로, 이 함수 안에서만 유효합니다.
전역 변수(Global Variables)
전역 변수는 모든 함수의 외부, 일반적으로 프로그램 상단에 정의되는 변수입니다. 전역 변수는 프로그램이 종료될 때까지 그 값을 유지하며, 프로그램 내 어느 함수에서든 접근할 수 있습니다. 즉, 한 번 선언되면 프로그램 전체에서 사용할 수 있습니다.
예제
#include <iostream>
using namespace std;
// 전역 변수 선언
int g;
int main () {
// 지역 변수 선언
int a, b;
// 실제 초기화
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}같은 이름의 지역 변수와 전역 변수
C++에서는 지역 변수와 전역 변수에 같은 이름을 사용할 수 있습니다. 하지만 함수 내부에서 같은 이름의 변수가 존재하면 지역 변수가 우선순위를 갖습니다. 아래 예제를 통해 확인해 보겠습니다.
예제
#include <iostream>
using namespace std;
// 전역 변수 선언 및 초기화
int g = 20;
int main () {
// 같은 이름의 지역 변수 선언
int g = 10;
cout << g;
return 0;
}실행 결과
10
출력 결과가 전역 변수의 값인 20이 아니라 지역 변수의 값인 10인 것을 확인할 수 있습니다. 이처럼 함수 내부에 동일한 이름의 지역 변수가 있다면 컴파일러는 항상 지역 변수를 우선하여 사용합니다.
지역 변수와 전역 변수의 초기화
지역 변수는 정의될 때 시스템에 의해 자동으로 초기화되지 않으므로, 반드시 프로그래머가 직접 초기값을 설정해야 합니다. 반면 전역 변수는 정의하는 순간 시스템이 아래 표와 같은 기본값으로 자동 초기화해 줍니다.
| 데이터 타입 | 기본 초기값 |
|---|---|
| int | 0 |
| char | '\0' |
| float | 0 |
| double | 0 |
| pointer | NULL |
초기화되지 않은 지역 변수를 사용하면 예측할 수 없는 값(쓰레기 값)이 출력될 수 있으므로, 지역 변수를 선언할 때는 항상 적절한 초기값을 할당하는 습관을 들이는 것이 좋습니다.