Name Mangling

파이썬에서 “name mangling"은 클래스 내부의 속성이나 메서드의 이름을 변경하는 기능이다.
이 기능은 주로 정보 은닉과 캡슐화를 위해 사용된다.

네임 맹글링의 작동 방식

  1. 더블 언더스코어 사용:

    • 클래스 내에서 속성이나 메서드 이름 앞에 두 개의 언더스코어(__)를 붙이면 자동으로 네임 맹글링이 적용된다.
     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)  # 김철수 출력
    
  2. 이름 변환 규칙:

    • 이름이 __(더블 언더스코어)로 시작하고 _로 끝나지 않는 경우에만 적용된다.
    • 변환 형식: _클래스명__멤버명
    • __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)           # "맹글링 안됨" 출력
    

상속 관계에서의 네임 맹글링

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Parent:
    def __init__(self):
        self.__data = "부모 데이터"
    
    def __private_method(self):
        return "부모의 비공개 메서드"

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.__data = "자식 데이터"  # 새로운 이름으로 맹글링됨
    
    def access_data(self):
        # 부모의 private 멤버에 직접 접근 불가
        return self._Child__data  # 자식의 __data에만 접근 가능

child = Child()
print(child._Parent__data)    # "부모 데이터"
print(child._Child__data)     # "자식 데이터"

네임 맹글링의 목적

  1. 정보 은닉:

    • 클래스 외부에서 직접 접근을 어렵게 만들어 캡슐화를 강화한다.
  2. 이름 충돌 방지:

    • 상속 시 발생할 수 있는 이름 충돌을 예방한다.
  3. Pseudoprivate 속성 구현:

    • 파이썬에는 진정한 의미의 private 속성이 없어, 이를 모방하는 데 사용된다.

주의사항

  1. 완전한 은닉이 아님:

    • 맹글링된 이름을 알면 여전히 접근 가능하다.
  2. 제한적 사용 권장:

    • 대규모 프로젝트나 협업 상황에서 제한적으로 사용하는 것이 좋다.
  3. 오버라이딩 주의:

    • 맹글링된 메서드를 상속 클래스에서 오버라이딩할 때는 주의가 필요하다.

파이썬 스타일 가이드

파이썬 커뮤니티에서는 일반적으로 단일 언더스코어(_)를 사용하여 내부 사용 속성을 표시하는 것을 선호한다. 더블 언더스코어는 특별한 경우에만 사용하는 것이 좋다.

네임 맹글링은 파이썬의 독특한 기능 중 하나로, 정보 은닉을 구현하는 데 도움을 주지만, 완벽한 private 속성을 제공하지는 않는다. 따라서 이 기능의 한계를 이해하고 적절히 사용하는 것이 중요하다.


참고 및 출처