객체의 속성(attribute)은 클래스 정의 외부에서 보일 수도 있고, 숨겨질 수도 있습니다. 파이썬에서는 속성 이름 앞에 이중 언더스코어(__)를 붙이면 해당 속성이 클래스 외부에서 직접 접근할 수 없도록 은닉됩니다. 이러한 기법을 데이터 은닉(Data Hiding)이라고 부르며, 객체 지향 프로그래밍에서 내부 구현을 보호하고 캡슐화를 강화하는 중요한 개념입니다.
예제 코드
#!/usr/bin/python
class JustCounter:
__secretCount = 0
def count(self):
self.__secretCount += 1
print self.__secretCount
counter = JustCounter()
counter.count()
counter.count()
print counter.__secretCount실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
1
2
Traceback (most recent call last):
File "test.py", line 12, in <module>
print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'왜 AttributeError가 발생할까?
클래스 외부에서 __secretCount에 직접 접근하려고 하면 AttributeError가 발생합니다. 이는 파이썬이 이중 언더스코어로 시작하는 속성을 자동으로 보호하기 때문입니다.
구체적으로, 파이썬은 내부적으로 속성 이름을 변경하여 클래스 이름을 포함시키는데, 이를 네임 맹글링(name mangling)이라고 합니다. 즉, __secretCount는 실제로 _JustCounter__secretCount라는 이름으로 변환되어 저장됩니다.
네임 맹글링된 속성에 접근하기
네임 맹글링이 적용된 속성은 object._className__attrName 형식으로 접근할 수 있습니다. 코드의 마지막 줄을 다음과 같이 수정하면 정상적으로 동작합니다.
......................... print counter._JustCounter__secretCount
수정 후 실행하면 다음과 같은 결과가 출력됩니다.
1 2 2
정리
- 속성 이름 앞에 이중 언더스코어(
__)를 붙이면 클래스 외부에서 직접 접근이 차단됩니다. - 파이썬은 네임 맹글링을 통해 속성 이름을
_클래스명__속성명형태로 변환합니다. - 변환된 이름을 사용하면 외부에서도 접근할 수 있지만, 이는 캡슐화 원칙에 어긋나므로 권장되지 않습니다.
데이터 은닉은 클래스의 내부 상태를 보호하고, 의도치 않은 수정으로부터 코드를 안전하게 지키는 데 유용한 기법입니다. 다만 파이썬의 네임 맹글링은 엄격한 접근 제어가 아닌 '약한 보호'라는 점을 기억해 두세요.