본문 바로가기

비공개 속성

비공개 속성은 속성명 앞에 '__'를 붙여 정의합니다. 네임 맹글링으로 '_클래스명__속성명' 형태로 변경되어 외부 접근이 어려워지지만, 완전한 비공개는 아닙니다.

1. 비공개 속성(Private Attributes)

대부분의 객체 지향 프로그래밍 언어에는 클래스의 속성과 메서드의 접근 제어를 위한 다양한 수준의 접근 제한자(access modifiers)가 있습니다. 다만, 이 비공개 속성은 완전한 "비공개"는 아니며 "비공개처럼" 작동하게 하는 기술입니다.

비공개 속성(Private Attributes)은 클래스 내부에서만 접근이 가능하며 외부에서는 접근이 제한되는 속성을 의미합니다. 파이썬에서는 속성 이름 앞에 두 개의 언더스코어(__)를 붙여 해당 속성을 비공개처럼 표현할 수 있습니다.

class MyClass:
    __a = 10
    _a = 100
    b = 20

    def __init__(self, c, d):
        self.__c = c
        self.d = d

c = MyClass(30, 40)
# c.__a #error
# c._a # 출력: 100
# c.b # 출력: 20
# c.__c # error
c.d # 출력: 40

2. 네임 맹글링(Name Mangling)

속성 이름 앞에 두 개의 언더스코어를 붙이면 파이썬은 네임 맹글링(name mangling)이라는 메커니즘을 사용하여 속성의 이름을 변경합니다. 이로 인해 외부에서 해당 속성에 직접 접근하는 것이 어려워집니다.

이름 앞에 언더스코어 두 개가 붙은 속성은 _클래스명__속성명으로 이름이 바뀌어 저장됩니다. 그래서 원래 이름으로는 밖에서 찾을 수 없습니다. 실제로 어떤 이름으로 담겼는지 확인해봅시다.

class MyClass:
    def __init__(self, c, d):
        self.__c = c
        self.d = d

c = MyClass(30, 40)
print(c.__dict__)  # {'_MyClass__c': 30, 'd': 40}

그러나 완전히 접근을 제한하는 것은 아니기 때문에, 바뀐 이름을 알고 있다면 _클래스명__속성명 형태로 여전히 접근과 수정이 가능합니다.

class MyClass:
    def __init__(self, c, d):
        self.__c = c
        self.d = d

c = MyClass(30, 40)
print(c._MyClass__c)  # 출력: 30
c._MyClass__c = 100   # 수정도 됩니다.
print(c._MyClass__c)  # 출력: 100

보안상 중요한 내용이니 꼭 기억해두세요. 완전히 감춰지는 변수가 아닙니다.

3. 비공개 속성의 목적

파이썬에서는 속성의 완전한 비공개는 지원하지 않으나, 두 개의 언더스코어를 사용하여 비공개처럼 속성을 정의할 수 있습니다. 이는 클래스의 안정성을 유지하고, 객체의 내부 로직을 숨기기 위한 목적으로 활용됩니다.

비공개 속성 - 견고한 파이썬 | 위니버시티