비공개 속성
비공개 속성은 속성명 앞에 '__'를 붙여 정의합니다. 네임 맹글링으로 '_클래스명__속성명' 형태로 변경되어 외부 접근이 어려워지지만, 완전한 비공개는 아닙니다.
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. 비공개 속성의 목적
파이썬에서는 속성의 완전한 비공개는 지원하지 않으나, 두 개의 언더스코어를 사용하여 비공개처럼 속성을 정의할 수 있습니다. 이는 클래스의 안정성을 유지하고, 객체의 내부 로직을 숨기기 위한 목적으로 활용됩니다.