
파이썬 프로그래밍을 배우다 보면 가장 먼저 마주하는 난관 중 하나가 바로 '변수의 범위(Scope)'입니다. 특히 함수 내부에서 함수 외부에 선언된 변수(전역 변수)의 값을 읽는 것은 가능하지만, 값을 수정하려고 할 때 예기치 않은 오류(UnboundLocalError)가 발생하거나 값이 변하지 않는 현상을 겪게 됩니다. 이때 구원 투수로 등장하는 것이 바로 global 키워드입니다. 본 포스팅에서는 단순한 문법 설명을 넘어, 왜 파이썬이 이러한 구조를 가지고 있는지, global 키워드를 언제 사용해야 하며, 실무에서는 왜 이를 지양하고 대안을 찾는지 전문 개발자의 관점에서 심도 있게 다룹니다.
1. 파이썬의 변수 범위: LEGB 규칙
파이썬은 변수를 찾을 때 LEGB 규칙을 따릅니다. 이는 변수가 어디에 선언되었느냐에 따라 우선순위를 정하는 규칙입니다.
- Local (L): 함수 내부
- Enclosing (E): 중첩 함수에서 상위 함수의 범위
- Global (G): 모듈 최상위 수준 (전역)
- Built-in (B): 파이썬 내장 함수 및 키워드 (print, len 등)
중요한 점은, 함수 내부에서 변수에 값을 할당(=)하는 순간, 파이썬은 해당 변수를 해당 함수의 Local(지역) 변수로 간주한다는 것입니다. 만약 전역 변수와 이름이 같은 변수에 값을 할당하면, 전역 변수를 수정하는 대신 동일한 이름의 '새로운 지역 변수'를 생성하게 됩니다.
2. global 키워드의 역할과 필요성
함수 안에서 외부에 선언된 전역 변수를 단순히 참조(Read)만 하는 경우에는 키워드가 필요 없습니다. 하지만 수정(Update/Write)을 하려면 파이썬 인터프리터에게 "이 변수는 여기서 새로 만드는 지역 변수가 아니라, 저 밖에 있는 전역 변수야!"라고 명시해줘야 합니다. 이것이 global 키워드의 핵심 역할입니다.
예시 상황: global이 없을 때 발생하는 문제
count = 0
def increment():
count = count + 1 # UnboundLocalError 발생 가능성 농후
print(count)
increment()
위 코드에서 count = count + 1은 할당 연산자가 포함되어 있으므로 파이썬은 count를 지역 변수로 인식합니다. 그런데 우항의 count + 1을 계산하려니 지역 변수 count에 아직 값이 할당되지 않아 오류가 발생합니다.
3. global 키워드 사용법 및 Sample Example
실제 동작하는 코드를 통해 global의 사용법을 확인해 보겠습니다. 다음은 프로그램의 상태(로그인 여부)를 전역으로 관리하는 예시입니다.
[Sample Example] 전역 상태 업데이트
# 전역 변수 선언
is_logged_in = False
user_name = "Guest"
def login(name):
# 전역 변수를 수정하겠다고 명시
global is_logged_in, user_name
print(f"시스템: {name}님 로그인을 시도합니다.")
is_logged_in = True
user_name = name
def logout():
global is_logged_in, user_name
is_logged_in = False
user_name = "Guest"
print("시스템: 로그아웃 되었습니다.")
def check_status():
# 읽기만 할 때는 global 키워드가 필요 없음
if is_logged_in:
print(f"현재 접속 중: {user_name}")
else:
print("현재 오프라인 상태입니다.")
# 실행 흐름
check_status()
login("Alice")
check_status()
logout()
check_status()
4. global 사용 시 주의사항 및 비교 분석
global 키워드는 편리해 보이지만, 대규모 프로젝트에서는 '스파게티 코드'를 만드는 주범이 됩니다. 어디서든 전역 변수를 수정할 수 있게 되면 프로그램의 흐름을 추적하기 매우 어려워지기 때문입니다.
전역 변수 수정 방식 비교
| 구분 | global 키워드 사용 | 클래스(객체) 활용 | 반환값(return) 활용 |
|---|---|---|---|
| 주요 특징 | 직접 전역 변수 접근 및 수정 | 객체의 속성(Attribute)으로 관리 | 함수 결과를 받아 외부에서 업데이트 |
| 장점 | 코드가 짧고 직관적임(소규모) | 데이터와 기능을 캡슐화하여 관리 용이 | 함수의 순수성 유지, 테스트 용이 |
| 단점 | 디버깅이 어렵고 유지보수성 저하 | 초기 설계 구조가 복잡해질 수 있음 | 변수가 많아지면 return 값이 복잡해짐 |
| 추천 상황 | 간단한 스크립트, 단일 설정 값 변경 | 대규모 앱, 상태 중심 프로그래밍 | 순수 기능 중심의 유틸리티 함수 |
5. 전문가의 조언: global의 대안은?
현업 개발자들은 global 사용을 최소화하기 위해 다음과 같은 전략을 사용합니다.
- 반환값(Return Value) 사용: 함수가 계산된 값을 반환하고, 호출한 쪽에서 전역 변수를 갱신합니다.
- 클래스화: 전역 변수를 클래스의 인스턴스 변수로 만들어 상태를 관리합니다.
- 설정 모듈(Config Module):
config.py와 같은 별도 파일을 만들어 프로젝트 전체의 설정을 중앙 집중식으로 관리합니다.
6. 결론
파이썬의 global 키워드는 함수 내에서 전역 스코프의 변수를 수정해야 할 때 반드시 필요한 도구입니다. 하지만 이는 '필요악'에 가깝습니다. 변수의 범위를 명확히 이해하고, 코드의 가독성과 유지보수성을 위해 가급적 객체지향적인 설계나 함수의 리턴값을 활용하는 방향으로 코드를 작성하는 것이 진정한 파이썬 전문가로 가는 길입니다.
7. 내용 출처
- Python Software Foundation. "The global statement." Python 3.x Documentation.
- Lutz, M. (2013). "Learning Python, 5th Edition." O'Reilly Media.
- Real Python Team. "Defining Main Functions in Python." realpython.com.
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 재귀 함수(Recursive Function)의 마법 : 원리와 실전 설계 전략 (0) | 2026.02.13 |
|---|---|
| [PYTHON] 함수 기본 값(Default Parameter) 설정 시 치명적인 실수와 해결 방안 (0) | 2026.02.13 |
| [PYTHON] 지역 변수(Local)와 전역 변수(Global)의 완벽 가이드 : 스코프의 원리와 메모리 관리 (0) | 2026.02.13 |
| [PYTHON] @staticmethod와 @classmethod : 객체지향 설계의 품격을 높이는 마법의 데코레이터 (0) | 2026.02.12 |
| [PYTHON] 매개변수(Parameter)와 인자(Argument)의 차이는? : 개념적 정의부터 메모리 구조까지 (0) | 2026.02.12 |