더북(TheBook)

getter 함수와 이름이 같은 함수 즉, balance()가 하나 더 있는데 여기에는 @balance.setter가 붙어 있습니다(#3). 이 함수는 setter 함수가 되어 set_balance() 메서드와 같은 역할을 합니다. 중요한 점은 유저 프로그래머가 객체를 만들어 접근할 때는 getter, setter 함수의 이름인 balance를 마치 멤버인 것처럼 사용한다는 점입니다. 멤버에 직접 접근하는 것 같지만, 사실은 getter, setter 함수를 호출해 실제 멤버인 _balance에 접근합니다.

my_acnt.balance = -3000을 보면(#4) 마치 my_acnt 객체의 balance 멤버에 접근해 값을 변경하는 것처럼 보입니다. 하지만 my_acnt 객체에는 balance라는 멤버가 없습니다. balance라는 이름의 gettersetter 메서드만 있을 뿐입니다. #4는 setter 함수인 balance() 메서드를 호출합니다. setter 함수를 통해 변경을 시도하므로 _balance 멤버의 값은 음수로 변경되지 않습니다.

print(my_acnt.balance)는(#5) getter 함수인 balance() 메서드를 호출해 _balance 멤버에 접근합니다. #4에서 음수로 변경되지 않았으므로 실행 결과는 5000이 됩니다.

하지만 이 방법도 유저 프로그래머가 멤버로 접근하는 것을 원천적으로 막을 수는 없습니다. 왜 그런지 다음 코드를 봅시다.

>>> my_acnt.__dict__

{'user': 'greg', '_balance': 5000}

>>> my_acnt._balance = -3000

>>> my_acnt.balance

-3000


__dict__로 멤버를 확인할 수 있고 _balance 멤버로 접근해 값을 음수로 변경하면 setter 함수를 통해 변경하는 것이 아니므로 _balance 값이 음수로 바뀝니다. 이처럼 파이썬은 완벽한 정보 은닉은 제공하지 않습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.