nathan_H

Class member value encapsulation. 본문

Programming Laguage/Java

Class member value encapsulation.

nathan_H 2019. 5. 21. 21:44

 

 

OOP의 주요 특징인 캡슐화는 여러 가지 멤버를 하나의 형식으로

묶는 과정을 말하며 클래스를 통해 구현한다.

 

특히 클래스에 멤버를 정의할 때 어느 영역에서

해당 멤버에 접근할 수 있는지를 지정할 수 있게 하여

주요 멤버에 외부에서 접근하여 잘못된 상태가

만들어지지 않게 만들 수 있게 지원합니다.

이러한 특징은 접근 지정을 통한 정보 은닉이라고 부른다.

 

 

이러한 이유로 많은 OOP 언어에서는 멤버의

접근 지정을 설정할 수 있는

키워드(흔히 public, private, protected)를 제공하고 있다.

 

 

하지만 Python에서는 멤버의 접근 지정을

설정하는 키워드를 제공하고 있지 않다.

Python에서 클래스를 정의할 때

멤버 이름에 따라 접근 지정을 설정할 수 있다.

 

멤버 이름 앞에 언더바(_)가 두 개 붙으면

해당 형식 내부에서만 접근이 가능합니다.

이는 다른 OOP 언어의 private 접근 지정과 같다.

 

하지만 언더바 하나를 사용해

멤버변수에 직접 접근하지 말라라는

표시로 사용한다.

 

이는 사실 접근이 가능하지만

언더바 하나가 있는 변수는

접근하지말라는

일종의 약속이 되는 것이다.

 

그리고 property를 활용해

멤버 변수로 직접 접근하는 것이

아닌 멤버 함수로써 접근을 하는 것이

oop의 캡슐화에서의 올바른 접근 방법이다.

 

'''
by using property and setter class member value encapsulation.

'''
class calculator():
    max_digits = 20
    def __init__(self, battery, cur_result, digit_system):
        self._battery = battery
        self._cur_result = cur_result
        self._prev_result = []
        self._prev_calc = None
        self._digit_system = digit_system
    
    def add(self, value):
        self._prev_result += [self._cur_result]
        self._cur_result += value
        self._prev_calc = "add"

    def sub(self, value):
        self._prev_result += [self._cur_result]
        self._cur_result -= value
        self._prev_calc = "sub"

    @property 
    def cur_result(self): # prevent direct access to class member value
        return self._cur_result

    @cur_result.setter # cur_result value can change 
    def cur_result(self, value):
        self._cur_result = value


if __name__ == "__main__":
    c1 = calculator(100, 0, 10)
    c1.add(3)
    c1.sub(2)
    print(c1.cur_result)
    c1.cur_result = 3 # can change memeber value like variable.
    print(c1.cur_result)

 

 

Comments