目次
1. 글로벌 변수란 무엇인가?
글로벌 변수의 기본 개념
Python에서의 글로벌 변수는 프로그램 전체에서 접근 가능한 변수입니다. 함수와 클래스 외부에서 정의되며, 서로 다른 함수 간이나 모듈 간에 데이터를 공유하기 위해 사용됩니다. 다만, 글로벌 변수를 남용하면 예상치 못한 버그의 원인이 될 수 있으므로 사용에 주의가 필요합니다.# 글로벌 변수의 예
global_var = "글로벌 변수"
def show_global():
print(global_var)
show_global() # 출력: 글로벌 변수
글로벌 변수는 함수와 클래스 외부에 정의되어 프로그램의 어느 위치에서든 참조할 수 있습니다. 다만, 변경할 경우 특별한 주의가 필요합니다.지역 변수와의 차이
글로벌 변수와 달리, 지역 변수는 함수 내부에서 정의되며 그 스코프는 해당 함수 내에 제한됩니다. 지역 변수는 함수가 종료되면 소멸되고, 다른 함수나 외부에서 접근할 수 없습니다.def example_func():
local_var = "지역 변수"
print(local_var)
example_func() # 출력: 지역 변수
# print(local_var) # 오류: 지역 변수는 함수 외부에서 접근할 수 없습니다
지역 변수와 글로벌 변수의 차이를 이해하고 적절히 구분해서 사용함으로써 코드의 유지보수성이 향상됩니다.
2. 함수 내에서 전역 변수 사용 방법
전역 변수의 참조와 변경
전역 변수는 함수 내에서도 참조할 수 있지만, 함수 내에서 그 값을 변경하려면global
키워드가 필요합니다. 이를 사용하지 않으면 함수 내에서 같은 이름의 로컬 변수가 생성되어 전역 변수에 영향을 주지 않습니다.counter = 0 # 전역 변수
def increase_counter():
global counter
counter += 1
increase_counter()
print(counter) # 출력: 1
nonlocal
키워드 소개
nonlocal
키워드는 중첩된 함수에서 외부 로컬 변수를 변경하기 위해 사용합니다. 클로저를 사용할 때나 함수 내부에 상태를 유지하는 경우에 유용합니다.def outer_func():
outer_var = "외부"
def inner_func():
nonlocal outer_var
outer_var = "변경된 외부"
inner_func()
print(outer_var)
outer_func() # 출력: 변경된 외부
nonlocal
을 사용하면 내부 함수에서 외부 로컬 변수에 접근하고 조작할 수 있습니다.3. 전역 변수를 사용할 때 주의점
전역 변수 남용에 따른 위험
전역 변수는 매우 편리하지만, 남용하면 프로그램 전체에 예상치 못한 영향을 줄 가능성이 있습니다. 특히, 여러 함수에서 같은 전역 변수를 변경하는 경우, 어떤 함수가 언제 어떻게 값을 바꿨는지 추적하기 어려워집니다.counter = 0
def increment():
global counter
counter += 1
def decrement():
global counter
counter -= 1
increment()
decrement()
print(counter) # 출력: 0
이처럼 전역 변수가 여러 곳에서 변경되면 버그가 발생하기 쉬우므로, 가능한 사용을 자제하고 다른 방법으로 데이터를 관리하는 것이 권장됩니다.에러 핸들링 및 디버깅
전역 변수를 사용할 때 예상치 못한 오류가 발생할 가능성이 있습니다. 에러 핸들링을 추가하고logging
모듈을 사용함으로써, 오류가 발생한 위치를 파악하고 디버깅을 쉽게 할 수 있습니다.import logging
logging.basicConfig(level=logging.DEBUG)
counter = 0
def increment():
global counter
try:
counter += 1
logging.debug(f"counter incremented: {counter}")
except Exception as e:
logging.error(f"오류: {e}")
increment()
이 방법을 사용하면 전역 변수의 변경이 어디에서 이루어졌는지, 어떤 오류가 발생했는지를 기록할 수 있습니다.4. 전역 변수의 베스트 프랙티스
전역 변수 사용을 최소화하기
전역 변수는 가능한 한 사용을 최소화하는 것이 권장됩니다. 대신 함수 인자와 반환값을 사용해 데이터를 주고받음으로써 데이터 흐름을 명확히 하고, 의도하지 않은 변경을 피할 수 있습니다.def add_points(score, points):
return score + points
current_score = 0
current_score = add_points(current_score, 10)
print(current_score) # 출력: 10
이처럼 함수 인자와 반환값을 활용함으로써 전역 변수에 의존하지 않고 데이터를 관리할 수 있습니다.클래스를 이용한 상태 관리
클래스를 사용하면 전역 변수를 사용하지 않고 상태를 관리할 수 있습니다. 클래스는 데이터 캡슐화와 스코프를 명확히 하는 효과적인 수단입니다.class Game:
def __init__(self):
self.score = 0
def add_points(self, points):
self.score += points
game = Game()
game.add_points(10)
print(game.score) # 출력: 10
클래스를 사용하면 상태를 개별 인스턴스에 캡슐화하여 다른 부분에서의 의도치 않은 변경을 방지할 수 있습니다.5. 실용적인 예와 애플리케이션
게임 개발에서의 사용 예
게임 개발에서는 점수와 라이프 상태를 관리하기 위해 전역 변수를 사용할 수 있지만, 대규모 프로젝트에서는 클래스나 데이터베이스를 이용한 관리가 권장됩니다.score = 0 # 전역 변수
def increase_score(points):
global score
score += points
increase_score(10)
print(f"플레이어 점수: {score}") # 출력: 플레이어 점수: 10
설정 관리를 위한 전역 변수
애플리케이션 전체에서 사용되는 설정 정보(예: 디버그 모드와 버전)는 전역 변수로 다루어지는 경우가 많지만, 설정 파일이나 환경 변수와 연동함으로써 효율적으로 관리할 수 있습니다.config = {
'debug': True,
'version': '1.0'
}
def print_config():
print(f"디버그 모드: {config['debug']}, 버전: {config['version']}")
print_config() # 출력: 디버그 모드: True, 버전: 1.0

6. 요약 및 다음 단계
전역 변수는 간단한 시나리오에서는 편리하지만, 남용하면 코드가 복잡해지고 버그의 원인이 됩니다. 함수 인자와 반환값, 클래스를 활용하여 전역 변수 사용을 최소화하는 것이 효율적이고 안전한 프로그램 설계로 이어집니다.다음에 배워야 할 주제
다음 단계로, 클로저, 모듈 스코프, 객체 지향 프로그래밍 (OOP)에 대해 배우는 것을 권장합니다. 이를 통해 전역 변수에 의존하지 않고 더 복잡한 프로그램을 설계할 수 있게 됩니다.외부 리소스 및 참고 링크
- Python 공식 문서 Python의 스코프, 클로저, OOP에 관한 자세한 설명을 제공합니다. 특히, LEGB 규칙(로컬, 인클로징, 글로벌, 빌트인)의 이해에 도움이 됩니다. Python 공식 문서