변수 스코프 - 지역 변수와 전역 변수의 탐색 순서
요약
변수 스코프(Scope)의 개념과 이름 탐색 순서를 알아봅니다. 함수 안에서 변수를 사용하면 지역 → 전역 순서로 찾는 규칙, 섀도잉(Shadowing), 전역 변수가 사용되는 조건을 정보처리기사 실기 기출문제와 함께 정리합니다.
변수 스코프 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 스코프(Scope) | 변수에 접근할 수 있는 유효 범위 | 함수 안 / 함수 바깥 |
| 지역 변수 | 함수 안에서 선언, 함수 종료 시 메모리에서 사라짐 | void func() { int x = 5; } |
| 전역 변수 | 함수 바깥에서 선언, 프로그램 종료 시 메모리에서 사라짐 | int x = 10; (함수 밖) |
| 이름 탐색 순서 | 지역 스코프 → 전역 스코프 순서로 탐색 | 지역에 x가 없으면 전역 x 사용 |
| 섀도잉(Shadowing) | 지역 변수가 같은 이름의 전역 변수를 가림 | 전역 x = 10, 지역 x = 99 → 99 |
스코프란? 쌩기초
스코프(Scope) 란 변수가 유효한 범위입니다. 같은 이름의 변수라도 선언된 위치에 따라 접근 가능 여부가 달라집니다.
- 전역 변수 x는 어디서든 접근 가능
- 지역 변수 y는 선언된 함수 안에서만 접근 가능
이름 탐색 순서 (핵심) 기초
함수 안에서 변수 이름을 사용하면, 프로그램을 실행하는 도구 1가 안쪽 스코프부터 바깥쪽으로 탐색합니다.
C언어: 지역 → 전역
func 안에서 n을 사용했지만 지역 변수 n이 없으므로, 전역에서 선언된 int n = 100을 찾아 사용합니다.
Java: 지역 → 인스턴스/클래스 변수
Python: LEGB 규칙
Python은 4단계로 탐색합니다.
| 순서 | 스코프 | 뜻 | 설명 |
|---|---|---|---|
| 1 | Local | 지역 | 현재 함수 안에서 선언된 변수 |
| 2 | Enclosing | 감싸는 함수 | 함수 안에 함수가 있을 때, 바깥쪽 함수의 변수 |
| 3 | Global | 전역 | 파일 전체에서 접근 가능한 변수 |
| 4 | Built-in | 내장 | Python이 기본 제공하는 이름 (print, len 등) |
섀도잉 (Shadowing) 기초
지역 변수가 전역 변수와 같은 이름으로 선언되면, 함수 안에서는 지역 변수가 우선합니다. 전역 변수는 가려져서 접근할 수 없습니다. 이것을 섀도잉(Shadowing) 이라고 합니다.
- func 안의 x는 지역 변수 → 전역 x와 별개
- func에서 x를 99로 설정해도 전역 x(10)는 변하지 않음
섀도잉 vs 전역 변수 직접 사용 기초
두 경우를 비교하면 이름 탐색 순서가 명확해집니다.
| 상황 | 코드 | n은? |
|---|---|---|
| 지역 변수 있음 (섀도잉) | void func() { int n = 5; printf("%d", n); } | 지역 변수 5 |
| 지역 변수 없음 | void func() { printf("%d", n); } | 전역 변수 |
| 상황 | 코드 | n은? |
|---|---|---|
| 지역 변수 있음 (섀도잉) | static void func() { int n = 5; System.out.println(n); } | 지역 변수 5 |
| 지역 변수 없음 | static void func() { System.out.println(n); } | 클래스 변수 |
| 상황 | 코드 | n은? |
|---|---|---|
| 지역 변수 있음 (섀도잉) | def func(): n = 5; print(n) | 지역 변수 5 |
| 지역 변수 없음 | def func(): print(n) | 전역 변수 |
전역 변수 공유의 함정 심화
함수 안에 지역 변수가 없어서 전역 변수를 사용하는 경우, 여러 함수가 같은 전역 변수를 공유하게 됩니다. 한 함수에서 값을 바꾸면 다른 함수에서도 바뀐 값이 보입니다.
add 함수 안에 count라는 지역 변수가 없으므로 전역 count를 직접 수정합니다. 호출할 때마다 값이 누적됩니다.
이 개념은 23년 2회 실기에서 출제되었습니다. 해당 문제에서는 특정 함수 안에 배열이 선언되어 있지 않아서, 전역에 선언된 배열을 그대로 사용하게 됩니다. 함수를 여러 번 호출하면 매번 같은 전역 배열을 덮어쓰기 때문에, 이전 호출의 결과가 다음 호출에 영향을 줍니다.
Python에서는 함수 안에서 전역 변수의 값을 바꾸려면 global 키워드를 먼저 선언해야 합니다. 선언하지 않으면 같은 이름의 새로운 지역 변수가 만들어집니다.
관련 개념
스코프를 이해했다면, 다음 개념도 함께 알아두면 시험에 도움이 됩니다.
- 변수 선언 - 변수의 기본 선언 방법과 초기화
- 메모리 구조 - 전역 변수는 데이터 영역, 지역 변수는 스택에 저장
- static 키워드 - C는 값 유지, Java는 클래스 소속 — 공통점과 차이점 비교
- Call by Value - 함수에 값을 전달할 때 지역 변수가 새로 만들어지는 원리
정보처리기사 실기 대비 문제
Footnotes
-
C언어에서는 컴파일러, Python에서는 인터프리터라고 합니다. 코드를 기계가 이해할 수 있는 형태로 바꿔주는 도구입니다. ↩