프로그래밍에서 스코프(scope)란 변수가 유효한 프로그램 내의 영역을 의미합니다. 넓은 의미로 C++에서 변수는 크게 세 가지 위치에 선언할 수 있습니다.
- 지역 변수(Local Variables) — 함수 또는 블록({ }) 내부에 선언된 변수
- 형식 매개변수(Formal Parameters) — 함수의 매개변수 정의 부분에 선언된 변수
- 전역 변수(Global Variables) — 모든 함수 외부에 선언된 변수
지역 변수(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;
}실행 결과
30
위 예제에서 변수 a, b, c는 main() 함수 내부에 선언된 지역 변수이므로, 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;
}실행 결과
30
위 예제에서 g는 전역 변수이므로 main() 함수 내부에서 자유롭게 접근하여 값을 변경하고 출력할 수 있습니다.
지역 변수와 전역 변수의 이름이 같을 때
하나의 프로그램에서 지역 변수와 전역 변수에 같은 이름을 사용하는 것도 가능합니다. 다만 이름이 중복될 경우, 함수 내부에서는 지역 변수가 우선순위를 갖습니다. 만약 같은 이름의 전역 변수에 접근해야 한다면 스코프 해결 연산자(::)를 사용해야 합니다.
예제
#include <iostream>
using namespace std;
// 전역 변수 선언:
int g = 20;
int main () {
// 지역 변수 선언:
int g = 10;
cout << g; // 지역 변수 출력
cout << ::g; // 전역 변수 출력
return 0;
}실행 결과
10 20
위 예제처럼 변수 이름만 쓰면 지역 변수(g = 10)가 출력되고, 스코프 해결 연산자(::)를 붙이면 전역 변수(g = 20)에 접근할 수 있습니다.
정리
- 지역 변수: 함수나 블록 내부에서 선언되며, 해당 범위 안에서만 유효하고 함수 종료 시 소멸됩니다.
- 전역 변수: 모든 함수 외부에 선언되며, 프로그램 전체 생명주기 동안 유지되고 어디서든 접근 가능합니다.
- 이름 충돌 시: 지역 변수가 우선하며, 전역 변수에 접근하려면 :: 연산자를 사용합니다.