초보 개발자

28강 정보은닉과 __dict__ 본문

Python/윤성우 열혈 파이썬

28강 정보은닉과 __dict__

taehyeki 2022. 1. 24. 22:35

위와 같은 클래스를 만들었다고 해보자. add_age는 나이를 추가해주는 함수이다. 나이는 기본적으로 음수가 될 수 없으니 사전에 음수를 차단하는 기능을 만들어주었다.

 

그리고 p라는 객체를 만들고 나이를 하나 추가해주었다.

하지만

age에 직접접근하여 -20을 해주었더니 결국 음수를 더해버렸다.

이렇게 p.age처럼 직접 변수에 접근하는 것을 직접접근이라고한다.

우리는 보안을 높이기 위해 간접접근 하는 방법을 배워보려고한다.

 

그 방법은 변수 이름 앞에 언더바 2개를 붙이는 것이다 __ 이렇게 붙이면 외부에서 접근을 못하도록 파이썬이 막아준다.

클래스 내에서는 당연히 __변수로 접근이 가능하다.

 

위 처럼 __를 붙여주고 다시 실행시켜보면 아래와 같은 오류가 난다. Person에는 age라는 변수가 없다고 한다.

그럼 __age라고 해줘야하나? 싶어서 해줬는데 이 역시

아래와 같은 오류가 발생했다.

 

이제 외부에서의 접근을 완전히 막아버렸다. age를 추가하기 위해선 저 add_age를 통해서만 접근이 가능하도록 허용범위를 좁혀둔 것이다. 이걸 정보은닉이라고 한다.

 

단 파이썬에서 언더바를 하나 _ 만 붙이는 경우도 있다. 이 경우에는 이 변수를 직접접근하지 말라는 뜻이다.

그렇다고는 해도 실제로 직접접근은 가능하다. 따라서 아래의 결과도 3이라는 숫자가 나오지만,

규칙을 정해 놓았다고 할 수 있다. 이 변수는 직접접근하지 마시오!

[__dicit__]

클래스 인스턴스 내에는 해당 객체의 변수 정보를(속성 정보) 담고 있는 딕셔너리가 하나 존재한다.

객체 내에는 __dict__가 있으며 이는 딕셔너리이다.

__dict__에는 해당 객체의 변수 정보가 담긴다.

객체 생성 후 변수를 생성하여도 잘 출력이 된다.

신기한 것이 __dict__를 통해서 값을 바꿀 수도 있다. 아래와 같이 __dict__를 통해서 가져온 값 중, _name의 value를 바꿔도 아래와 같이 출력이 된다.

이를 통해 알 수 있는 사실은 객체 내에 있는 변수의 값은 사실 __dict__를 통해서 관리가 된다는 것을 알 수 있다,

모든 객체는 __dict__를 가지고 있고 객체의 정보가 __dict__에 담긴다. 서로 다른 메모리 상에 존재한다. 

그리고 __dict__라는 것으로 참조하고 있는 것이다. 이를통해 유연성이 극대화 된다. 객체의 메모리는 한정적으로 두되 바깥의 __dict__을 통해 추가 및 삭제가 가능하기 때문이다. 하지만 단점은 객체가 변수에 접근할 때 __dict__을 한번 거쳐야 하기 때문에 즉 중간과정이 하나 생긴 것이다. 값을 참조하는 시간이 느려짐 이 부분은 __slots__으로 보완 가능

__dict__은 각 객체당 하나씩 존재한다. 우리가 변수를 수정함에 따라 __dict__는 값이 추가되거나 변경이 된다.

 

다음 두 문장은 완전히 동일하다

p._n = 'lee'

p.__dict__['_n'] = 'lee'

 

전에 변수 앞에 언더바 2개 __를 붙이면 정보 은닉이 가능하다. 그 이유를 살펴보자

__name이 _Person__name로 바뀐 것을 알 수 있다. 따라서 이름이 바뀌었으니 정보에 접근이 불가능 했던 것이다.

바뀐 이름으로 접근하면 사실 값이 변경이 가능했던 것이었다.

'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글

30강 프로퍼티  (0) 2022.01.25
29강 __slots__의 효과  (0) 2022.01.25
27강 연산자 오버로딩  (0) 2022.01.24
26강 스페셜 메소드  (0) 2022.01.18
24강 상속  (0) 2022.01.18