1. 네임스페이스란?
파이썬에서 네임스페이스(namespace) 는 **“이름(name)과 객체(object)를 연결해 놓은 공간”**입니다.
- 이름 = 우리가 코드에서 쓰는 식별자 (변수명, 함수명, 클래스명 등)
- 객체 = 실제 메모리에 존재하는 데이터 (숫자, 문자열, 함수 객체 등)
즉, 네임스페이스는 이름표와 실제 데이터를 이어주는 테이블이라고 할 수 있습니다.
파이썬 내부적으로는 딕셔너리(dict)로 구현되어 있어요.
1️⃣ __dict__ : 네임스페이스 자체
클래스나 인스턴스의 네임스페이스를 직접 확인하고 싶다면 __dict__ 속성을 보면 됩니다.
이 안에는 이름 → 객체 매핑 관계가 딕셔너리 형태로 저장되어 있습니다.
class MyClass:
a = 1
def hello(self):
return "hi"
obj = MyClass()
obj.b = 2
print(MyClass.__dict__) # 클래스 네임스페이스
print(obj.__dict__) # 인스턴스 네임스페이스
출력 예시 (일부):
{'__module__': '__main__', 'a': 1, 'hello': <function ...>}
{'b': 2}
- MyClass.__dict__ → 클래스 변수와 메서드가 들어 있음 (a, hello)
- obj.__dict__ → 인스턴스 변수만 들어 있음 (b)
2. 인스턴스 네임스페이스에는 왜 함수가 없을까?
위 예시를 보면, 인스턴스 네임스페이스(obj.__dict__)에는 b만 있고 hello 같은 메서드는 보이지 않습니다.
이유는 인스턴스마다 메서드 객체를 복사해 저장하면 비효율적이기 때문입니다.
→ 그래서 메서드는 클래스 네임스페이스에서 관리하고,
→ 인스턴스는 자신만의 데이터(인스턴스 변수) 만 네임스페이스에 둡니다.
즉:
- 인스턴스 네임스페이스 = 해당 인스턴스 전용 데이터만 보관
- 클래스 네임스페이스 = 모든 인스턴스가 공유하는 메서드와 클래스 변수 보관
그래서 dir(obj)를 찍으면, 인스턴스 네임스페이스 + 클래스 네임스페이스까지 탐색되어 메서드가 보이는 겁니다.
1️⃣ dir() : 네임스페이스 뷰(view)
dir()은 네임스페이스 그 자체를 보여주지 않습니다.
대신 **“이 객체에서 접근 가능한 이름들”**을 리스트 형태로 반환합니다.
print(dir(obj))
출력 예시 (일부):
['__class__', '__delattr__', ..., 'a', 'b', 'hello']
여기에는 세 가지 종류의 이름이 섞여 있습니다:
- 인스턴스 네임스페이스(b)
- 클래스 네임스페이스(a, hello)
- 상속받은 부모 클래스에서 온 기본 메서드들(__class__, __delattr__ 등)
3. __dict__ vs dir() 비교
| 구분 | __dict__ | dir() |
| 형태 | 딕셔너리(name -> object 매핑) | 리스트(이름 목록) |
| 보여주는 대상 | 해당 객체의 네임스페이스 자체 | 접근 가능한 모든 이름 (상속 포함) |
| 주요 용도 | 실제 매핑된 값(객체) 확인 | 어떤 이름들이 사용 가능한지 확인 |
정리하면
- __dict__ = 네임스페이스 그 자체 (이름과 객체의 매핑 테이블)
- dir() = 네임스페이스를 직접 보여주진 않고, 접근 가능한 이름들을 나열해주는 뷰(view)
- 인스턴스 네임스페이스에는 변수만 있고, 메서드는 없음 → 메서드는 클래스 네임스페이스에 보관됨
- 이렇게 나눈 이유는 효율성 때문 → 인스턴스마다 메서드를 복사하지 않고, 모든 인스턴스가 하나의 메서드를 공유
즉,
__dict__는 “이 객체 안에 어떤 이름이 무엇을 가리키고 있는지”를 보여주고
dir()은 “이 객체에서 어떤 이름들을 쓸 수 있는지”를 알려줍니다.
네임스페이스를 이해하면, 클래스/인스턴스 변수의 동작 원리와 이름 검색 순서(LEGB Rule)까지 명확해집니다.
앞으로 코드 디버깅이나 동적 속성 관리할 때 __dict__와 dir()를 잘 활용해 보세요!
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
| 파이썬에서 상속(Inheritance) vs 구성(Composition) (0) | 2025.09.10 |
|---|---|
| 파이썬에서 __add__와 연산자 재정의 (1) | 2025.09.06 |
| 파이썬에서 @property와 setter의 올바른 사용법 (0) | 2025.09.06 |
| 추상 클래스 제대로 쓰기: 변수·일반 메서드·super() 재사용 (1) | 2025.09.01 |
| 추상화란 무엇인가?? (0) | 2025.09.01 |