파이썬에서는 속성과 메서드가 전부 외부에 공개되므로 속성을 감출 수 있는 방안은 없다. 이런 속성을 감추는 것을 "정보 은닉" 이라고 한다. '감추는 것'이라 함은 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 으로 조회해도 변경된 내용이 조회된다.
'Python_programming' 카테고리의 다른 글
[Python] 함수(function)와 메서드(method)의 차이점 (0) | 2021.05.16 |
---|---|
'callable object' 에 대한 고찰 (0) | 2021.05.14 |
Python 생성자(__new__)에 대한 고찰 (0) | 2021.04.22 |
Python self 에 대한 고찰 (0) | 2021.04.22 |
Python 고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자 에 대한 고찰 (0) | 2021.04.19 |