balance를 모두 __balance로 바꾸었습니다(#1~#4). 실행하면 5000이 나옵니다. 마치 정보 은닉이 된 것처럼 보입니다. 하지만 실제로 정보 은닉이 된 것은 아닙니다. 코드 6-24를 실행한 다음 REPL에서 다음 코드를 작성해 봅시다.
>>> my_acnt.__dict__
{'user': 'greg', '_Account__balance': 5000, '__balance': -3000}
my_acnt의 __dict__를 통해 멤버를 확인할 수 있는데 my_acnt의 멤버가 우리의 예상과 다릅니다. 정보 은닉이 됐다면 __dict__를 사용해 출력하더라도 멤버 __balance가 보이지 않아야 합니다. 이상한 점은 멤버로 만든 적이 없는 _Account__balance가 보입니다. 어떻게 된 일일까요?
클래스 안에서 멤버 앞에 언더바( _ )를 두 개 붙이면 이 멤버는 객체가 만들어질 때 이름이 변합니다. ‘_클래스 이름’이 멤버 앞에 붙게 됩니다. 즉, 우리가 생성자에서 선언한 인스턴스 멤버 __balance는 _Account__balance로 바뀝니다. 하지만 __dict__를 통해 유저 프로그래머도 이를 알 수 있으므로 마음만 먹으면 얼마든지 접근하여 변경할 수 있습니다. 파이썬은 유저 프로그래머의 실수는 막아 주지만 의도적인 변경까지는 책임지지 않습니다.
그렇다면 -3000을 값으로 갖는 __balance 멤버는 무엇일까요? 이 멤버는 코드 6-24의 #4에서 my_acnt 객체만의 멤버 __balance를 새롭게 만든 것입니다. 파이썬에서 객체는 자신만의 멤버를 추가할 수 있습니다. 다른 Account 객체와 달리 my_acnt는 __balance라는 멤버 하나를 더 갖게 된 것입니다.