Name Mangling
파이썬에서 “name mangling"은 클래스 내부의 속성이나 메서드의 이름을 변경하는 기능이다.
이 기능은 주로 정보 은닉과 캡슐화를 위해 사용된다.
네임 맹글링의 작동 방식
더블 언더스코어 사용:
- 클래스 내에서 속성이나 메서드 이름 앞에 두 개의 언더스코어(
__
)를 붙이면 자동으로 네임 맹글링이 적용된다.
1 2 3 4 5 6 7 8 9 10 11
class Person: def __init__(self): self.__name = "김철수" # 실제로는 '_Person__name'으로 변환됨 def __private_method(self): # 실제로는 '_Person__private_method'로 변환됨 return "비공개 메서드" person = Person() print(dir(person)) # 실제 변환된 이름을 확인할 수 있음 print(person.__name) # AttributeError 발생 print(person._Person__name) # 김철수 출력
- 클래스 내에서 속성이나 메서드 이름 앞에 두 개의 언더스코어(
이름 변환 규칙:
- 이름이
__
(더블 언더스코어)로 시작하고_
로 끝나지 않는 경우에만 적용된다. - 변환 형식:
_클래스명__멤버명
__attribute
는_ClassName__attribute
로 변환된다.- 예:
MyClass
의__private_attr
은_MyClass__private_attr
로 변경된다.
1 2 3 4 5 6 7 8 9 10
class Example: def __init__(self): self.__private = "맹글링 됨" # _Example__private self._protected = "맹글링 안됨" # _protected self.__name__ = "맹글링 안됨" # __name__ self____weird = "맹글링 안됨" # ___weird example = Example() print(example._Example__private) # "맹글링 됨" 출력 print(example._protected) # "맹글링 안됨" 출력
- 이름이
상속 관계에서의 네임 맹글링
|
|
네임 맹글링의 목적
정보 은닉:
- 클래스 외부에서 직접 접근을 어렵게 만들어 캡슐화를 강화한다.
이름 충돌 방지:
- 상속 시 발생할 수 있는 이름 충돌을 예방한다.
Pseudoprivate 속성 구현:
- 파이썬에는 진정한 의미의 private 속성이 없어, 이를 모방하는 데 사용된다.
주의사항
완전한 은닉이 아님:
- 맹글링된 이름을 알면 여전히 접근 가능하다.
제한적 사용 권장:
- 대규모 프로젝트나 협업 상황에서 제한적으로 사용하는 것이 좋다.
오버라이딩 주의:
- 맹글링된 메서드를 상속 클래스에서 오버라이딩할 때는 주의가 필요하다.
파이썬 스타일 가이드
파이썬 커뮤니티에서는 일반적으로 단일 언더스코어(_
)를 사용하여 내부 사용 속성을 표시하는 것을 선호한다. 더블 언더스코어는 특별한 경우에만 사용하는 것이 좋다.
네임 맹글링은 파이썬의 독특한 기능 중 하나로, 정보 은닉을 구현하는 데 도움을 주지만, 완벽한 private 속성을 제공하지는 않는다. 따라서 이 기능의 한계를 이해하고 적절히 사용하는 것이 중요하다.