Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 데이터 은닉(Data Hiding) 개념과 활용 방법

객체의 속성(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

정리

  • 속성 이름 앞에 이중 언더스코어(__)를 붙이면 클래스 외부에서 직접 접근이 차단됩니다.
  • 파이썬은 네임 맹글링을 통해 속성 이름을 _클래스명__속성명 형태로 변환합니다.
  • 변환된 이름을 사용하면 외부에서도 접근할 수 있지만, 이는 캡슐화 원칙에 어긋나므로 권장되지 않습니다.

데이터 은닉은 클래스의 내부 상태를 보호하고, 의도치 않은 수정으로부터 코드를 안전하게 지키는 데 유용한 기법입니다. 다만 파이썬의 네임 맹글링은 엄격한 접근 제어가 아닌 '약한 보호'라는 점을 기억해 두세요.