14.4. 가시성(visibility) 및 맹글링(Name Mangling)

파이썬에서 클래스와 객체의 가시성(Visibility)은 접근 제한자를 통해 제어할 수 있습니다.

주로 클래스의 내부 구현을 숨기고, 외부에서의 접근을 제한하는 데 사용됩니다.

../../_images/13_04_1_visibility.webp

Fig. 14.4 가끔 클래스 내부의 내용을 보여주고 싶지 않습니다.
실제로 클래스 내부에 존재하지만 외부에서 볼 수 없도록
제어하는 것은 가시성(visibility) 제어라고 합니다.

파이썬에서는 가시성을 지정하기 위해 밑줄( _ )을 사용하며, 네임 맹글링(Name Mangling)을 통해 클래스 내부의 네임스페이스를 보호할 수 있습니다.

비공용 멤버를 선언할 때 사용되는 이중 밑줄( _ _ )은 네임 맹글링을 수행하여 클래스 외부에서 접근하지 못하게 합니다.

../../_images/13_04_2_mangling.webp

Fig. 14.5 맹글링은 “짓이기다”는 뜻을 가지고 있습니다.
맷돌을 생각하면 쉽습니다.
파이썬에서는 가시성을 지원하기 위해
이중 밑줄( _ _ )을 이용해 맹글링을 지원하고 있습니다.

네임 맹글링은 속성 이름을 변경하여 충돌을 피하고, 외부 접근을 어렵게 만듭니다.

14.4.1. 가시성(Visibility)

파이썬에서는 세 가지 주요 가시성 수준이 있습니다.

14.4.1.1. 공용(Public) 멤버

공용 멤버는 클래스 외부에서 자유롭게 접근할 수 있습니다.

이름에 밑줄을 사용하지 않습니다.

class MyClass:
    def __init__(self):
        self.public_var = "I am public"

obj = MyClass()
print(obj.public_var)  # 출력: I am public

14.4.1.2. 보호된(Protected) 멤버

보호된 멤버는 클래스 내부와 자식 클래스에서 접근할 수 있습니다.

이름 앞에 하나의 밑줄(_)을 사용합니다.

관습적으로 보호되지만, 실제 접근은 막지는 못합니다.

프로그래머들끼리 명시적으로 접근하면 안된다는 의미로 사용합니다.

class MyClass:
    def __init__(self):
        self._protected_var = "I am protected"

class ChildClass(MyClass):
    def access_protected(self):
        return self._protected_var

obj = ChildClass()
print(obj.access_protected())  # 출력: I am protected

14.4.1.3. 비공용(Private) 멤버 \(\to\) 맹글링

비공용 멤버는 클래스 내부에서만 접근할 수 있습니다.

이름 앞에 2개의 연속 밑줄(__)을 사용합니다.

네임 맹글링을 통해 접근이 제한됩니다.

다음 코드에서 __private_var는 실제로 _MyClass__private_var로 맹글링됩니다.

이를 통해 클래스 외부에서 직접 접근하는 것을 어렵게 만듭니다.

단, 클래스 내부에서 접근하는 것은 허용됩니다.

class MyClass:
    def __init__(self):
        self.__private_var = "I am private"

    def get_private_var(self):
        return self.__private_var

obj = MyClass()
print(obj.get_private_var())  # 출력: I am private

# 네임 맹글링 된 이름으로 접근
print(obj._MyClass__private_var)  # 출력: I am private

맨 위로 이동