Python에서는 속성(attribute) 이름 앞에 더블 언더스코어(__)를 붙여 해당 속성을 클래스 외부에서 접근할 수 없도록 만들거나 숨길 수 있습니다. 이러한 기법을 데이터 은닉(Data Hiding)이라고 부르며, 객체 지향 프로그래밍에서 캡슐화를 구현하는 핵심 요소 중 하나입니다.
데이터 은닉 예제
다음 코드는 변수 __hiddenVar가 어떻게 숨겨지는지 보여줍니다.
class MyClass:
__hiddenVar = 0
def add(self, increment):
self.__hiddenVar += increment
print(self.__hiddenVar)
myObject = MyClass()
myObject.add(3)
myObject.add(8)
print(myObject.__hiddenVar)
출력 결과
3
Traceback (most recent call last):
11
File "C:/Users/TutorialsPoint1/~_1.py", line 12, in <module>
print(myObject.__hiddenVar)
AttributeError: MyClass instance has no attribute '__hiddenVar'
결과 분석
위 프로그램에서 클래스 내부의 메서드를 통해서는 숨겨진 변수에 정상적으로 접근하여 값이 3, 11로 출력되었습니다. 하지만 마지막 줄처럼 객체를 통해 클래스 외부에서 숨겨진 변수에 직접 접근하려고 시도하자 AttributeError 예외가 발생했습니다.
즉, 더블 언더스코어로 선언된 속성은 클래스 외부에서 일반적인 방식으로는 접근할 수 없습니다.
숨겨진 속성에 접근하는 특별한 방법
다만, 다음과 같은 특별한 문법을 사용하면 숨겨진 속성 값에 여전히 접근할 수 있습니다.
class MyClass:
__hiddenVar = 12
def add(self, increment):
self.__hiddenVar += increment
print(self.__hiddenVar)
myObject = MyClass()
myObject.add(3)
myObject.add(8)
print(myObject._MyClass__hiddenVar)
출력 결과
15
23
23
Python의 네임 맹글링(Name Mangling)
위 예제에서 주목할 점은 _MyClass__hiddenVar라는 형태로 접근했다는 것입니다. 이것이 가능한 이유는 Python 인터프리터가 내부적으로 네임 맹글링(Name Mangling)을 수행하기 때문입니다. 즉, 더블 언더스코어로 시작하는 속성 이름은 _클래스명__속성명 형태로 자동 변환되어 저장됩니다.
따라서 Python에는 엄밀한 의미에서 '완전히 private'인 요소는 없습니다. private 메서드나 속성도 외부에서 접근하는 것이 불가능하지는 않으며, 단지 일반적인 경우보다 어렵게 만들어졌을 뿐입니다. 내부적으로 private 메서드와 속성의 이름은 맹글링(mangling)과 언맹글링(unmangling) 과정을 거치며, 주어진 원래 이름 그대로는 접근할 수 없도록 처리됩니다.
결론적으로, Python의 데이터 은닉은 강제적인 보안 장치라기보다는 개발자 간의 약속이자 의도를 표현하는 메커니즘입니다. 클래스 내부 구현 세부사항을 숨기고 외부 인터페이스를 명확히 하고 싶을 때 유용하게 활용할 수 있습니다.