개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 16. 정보 은닉과 __dict__ 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 16. 정보 은닉과 __dict__

hayongwoon 2022. 5. 9. 19:13

속성 감추기

 개발을 하다보면 그리고 다른 사람과 협업을 하다 보면 바뀌지 않아야 할 값들이 바뀔 가능성은 항상 존재한다. 그래서 이를 바꾸면 안되는 것이라고 약속하는 방법과 실제로 정보를 숨김으로써 정보에 직접 접근을 막는 방법을 소개하겠다. 

 

1. _속성이름

 언더바(_) 한개 일 때이다. 이는 기능상으로는 변화는 없지만 개발자들끼리 약속한 관습이라고 할 수 있다. 속성 이름 앞에 _가 한개 존재한다면 이 값은 우리가 직접 접근을 하면 안된다! 라고 약속을 한 것과 같다. 따라서 접근은 가능하나 아래 언더바가 한개 존재한다면 이 속성은 직접 접근을 하지 않겠다고 약속한 것이다.

 

2. __속성이름

언더바(_) 두개일 때이다. 이는 실제로 속성에 직접 접근하는 못하게 막는 방법이다. 정확히는 못하게 한다기 보다 감춘다라는 표현이 정확하겠다. 실제 속성을 감추어서 직접 접근을 __속성이름으로 접근을 못하게 하는 것이다. 어떤 방법으로 하는지 살펴보자!

 

2-1. __dict__  

객체 내에는 해당 객체의 변수(속성 값)의 정보를 담고있는 딕셔너리가 하나 존재한다. 해당 클래스.__dict__를 프린트 해보면 속성의 이름(key)과 값(value)가 담겨져 있다.

따라서 우리는 딕셔너리의 접근을 통해 객체의 변수 값을 수정할 수도 있다! 이는 곧 객체의 반영된다는 사실. 

실제로 우리가 객체의 변수에 접근하는 p.name = 'yongwoon' -> p.__dict__['name'] = 'yongwoon' 와 같다! 이를 이해하고 어떻게 정보를 숨길 수 있는지 살펴보자!

 

정보은닉을 반영한 값의 딕셔너리를 살펴보면 '_클래스이름__속성이름'으로 키가 설정된 것을 볼 수 있다. 그렇다 기존의 키를 접근하는 것에서 앞에 _클래스를 붙여줌으로써 직접 접근을 막는 것이다! 물론 p.__dict__['_Person__name'] 으로 직접 접근하여 수정할 수는 있긴 하다. 결론은 아예 막은 것은 아니고 기존의 속성값을 담아둔 __dict__의 이름을 살짝 바꿔줌으로써 막은 것이다!