본문 바로가기

Python_programming

'정보 은닉'에 대한 고찰

파이썬에서는 속성과 메서드가 전부 외부에 공개되므로 속성을 감출 수 있는 방안은 없다. 이런 속성을 감추는 것을 "정보 은닉" 이라고 한다. '감추는 것'이라 함은 100퍼센트  감춰지는 것' 은 아니다. 

 

1. "_이름"

 

클래스 내부에 언더바(_) 1개가 붙어있는 속성이나 메서드는 관행적으로 privat으로 처리함을 의미한다.

이는 외부에서 보호된 이름으로 사용되기에 호출해서 사용하면 안된다. 즉, 클래스를 사용할 때 내부적으로만 사용할(=외부에서 호출하지 않을) 속성이나 메서드는 언더바(_)를 1개 붙이면 된다.

 

"_속성명"은 관행상 접근을 보호해야 하므로 별도의 메서드를 구현해서 작성한다. 프로그램 작성 시 이 속성에 직접 접근하지 않고 메서드를 이용해서 실행해보자. 

 

* 코드 설명 * 

 

Protected 클래스를 정의할 때 보호된 이름으로 _ set 메서드를 정의했다. 이 메서드를 __ init__ 메서드 내에서 호출해 인스턴스가 생성될 때에도 보호된 속성으로 _name, _age 속성을 추가하도록 만들었다.  

보호된 속성에 직접 접근하지 않도록 getname, getage 메서드를 정의해서 호출하도록 구성했다.  

 

스폐셜 메서드 __init__ 에서 _ set 을 실행해서 초기화하도록 유도했다.(=직접 접근하지 않고 _set 메서드를 이용함)

 

p 라는 인스턴스를 생성 후 네임스페이스를 조회하면 보호된 속성("_속성명")이 만들어진 것을 볼 수 있다.

인스턴스의 메서드를 호출해서 출력하면 보호된 속성을 조회해서 출력함을 볼 수 있다.

 

 

 

 

 

하지만 다 공개되었기에 이 속성이 이름을 알면 바로 접근해서 조회가 가능하다.

 

 

 

2. "mangling"

 

" __ + 이름 " 처리 방식 = 맹글링    

맹글리 방식으로 이름을 사용하면 내부적으로 "_클래스__이름" 으로 처리되도록 구성한다.

(= 아래 코드에서 In[22] 행의 출력 결과에 나와있음) 


클래스 외부에서는  직접 " __ + 이름 " 으로 호출해도 검색이 불가능하지만 내부 클래스나 인스턴스에서는 " __ + 이름 " 으로 처리한다. 

 

좀전에 설명한 "보호된 속성"은 "언더바를 하나만 이름 앞에 사용"하는데, mangling 은 언더바를 2개 연속해서 이름 앞에 사용한다. 

 

 In[22] 행의 출력 결과를 보면 인스턴스 속성이 맹글링되어 처리된 것(  "_클래스__이름" ) 을 확인할 수 있다. 

 

 

 

 

 

 

 

 

자, 이제 인스턴스를 가지고 점 연산자로 _name 과 _age 속성에 접근하면 예외가 발생한다. 외부에서 조회할 때는 이름 변경시 이런 속성이 없다고 뜬다. 맹글링 처리된 이름을 외부에서 전체 이름을 주고 조회하면 결과가 출력됨을 확인할 수 있다.  ( = In[28] 행의 출력 결과)

 

 

 

 

 

 

3. Property

 

프로퍼티를 지정할 때는 주로 데코레이터를 사용한다. "메서드 바로 위에 @property" 를 지정하면 함수명으로 하나의 인스턴스를 만들고 그 내부의 getter 메서드에 등록된다. 

 

갱신이 필요한 메서드에는 "@함수명.setter" 로 처리해야 한다. 

 

하지만 내부의 속성 이름을 알고 있다면 메서드 대신 속성에 직접 접근해서도 조회나 갱신이 가능하다.

 

 

PropertyClass 클래스를 정의할 때 조회를 하는 메서드와 속성을 갱신하는 메서드 2개의 정의를 보면 앞에서 말한대로 정의가 되어있다.  

 

이름 조회와 변경 2가지 메서드 다 제대로 작동하고 있다.  ( = In[30,31] 행의 출력 결과)

 

 

 

 

 

 

 

인스턴스 네임스페이스를 조회하면 사용하는 name 이 아닌 _name 속성을 가지고 있다.  
직접 인스턴스 내의 속성을 가지고 조회해서 결과를 확인할 수 있다.  
_name의 내부 값을 변경한 후에 프로퍼티 name 으로 조회해도 변경된 내용이 조회된다.