Notice
Recent Posts
Recent Comments
Link
nathan_H
Class member value encapsulation. 본문
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)
'Programming Laguage > Java' 카테고리의 다른 글
[Java] 상속 핵심 개념과 추상 클래스 (0) | 2020.05.01 |
---|---|
[Java] 빠르게 정리하는 자바 클래스 (0) | 2020.04.28 |
[Java] Call By Value와 Call By Reference (0) | 2020.04.27 |
[Java] Enum을 잡아보자 (0) | 2020.04.25 |
[Python] 비동기 프로그래밍 (0) | 2019.03.06 |
Comments