문제의 역사
네임스페이스(namespace)는 파이썬의 기본 개념 중 하나로, 언어의 초기 구현부터 존재해왔습니다. 이 개념은 여러 프로그램 부분 간에 변수, 함수, 클래스의 이름 충돌을 피하기 위해 이름을 체계적으로 정리하는 데 용이합니다.
문제
대규모 프로젝트에서는 많은 함수, 클래스, 변수 및 모듈이 생겨납니다. 네임스페이스를 제대로 사용하지 않으면 중요한 이름이 가려지거나, 변수의 예상치 못한 그림자(shadow)가 발생하며, 테스트 및 확장 시 어려움이 생길 수 있습니다.
해결책
파이썬에서 네임스페이스는 이름과 객체를 연결하는 매핑(mapping)입니다. 네임스페이스의 종류에는 로컬, 글로벌, 모듈 네임스페이스, 클래스 네임스페이스 등이 있습니다. 이러한 분류를 이해하면 필요한 객체에 올바르게 접근하고 충돌을 최소화할 수 있습니다.
코드 예시:
def foo(): x = 10 # 함수의 로컬 네임스페이스 내의 x print(x) y = 20 # 모듈의 글로벌 네임스페이스 내의 y foo() print(y)
주요 특징:
같은 함수 내에서 글로벌 변수와 동일한 이름의 로컬 변수를 선언하면 어떻게 되나요?
로컬 변수가 함수 실행 중에 글로벌 변수를 가리게 됩니다; 함수 외부에서는 글로벌 변수는 변경되지 않습니다.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
현재 네임스페이스의 모든 이름 목록을 어떻게 얻을 수 있나요?
함수 locals(), globals(), dir()는 현재 스코프/네임스페이스의 해당 매핑 또는 이름 목록을 반환합니다.
클래스 네임스페이스와 인스턴스 네임스페이스의 차이점은 무엇인가요?
클래스 네임스페이스는 클래스의 모든 인스턴스에 공통인 속성을 정의합니다. 인스턴스 네임스페이스는 특정 객체의 속성을 의미합니다. 인스턴스의 변경은 클래스에 영향을 주지 않으며, 그 반대도 마찬가지입니다.
큰 프로젝트의 모든 부분에서 from mymodule import *를 사용했습니다. 결과적으로 함수 이름이 가려지고, 패키지 간 이름 충돌로 인해 추적하기 어려운 버그가 발생했습니다.
장점:
단점:
가져오기에 별칭(import mymodule as mm)을 사용하고 모듈을 명확히 구조화했습니다.
장점:
단점: