캡슐화를 통해서 내부에 있는 변수에 대한 접근은 막아준다. 파이썬에서는 _를한번만 사용하여 변수를 정의하는 것을 선호한다.(PEP8) __가 된다면 완전히 접근을 막기 때문에 유연한 프로그램(테스팅에서 사용)을 할 수 없다. _가 들어간 변수라면 테스팅할때 사용하는 것은 괜찮지만 실제 작성하는 코딩에서는 무조건 직접 언급하는것을 피해야한다.
아래의 코드를 보면 연봉과 몇개의 버그를 수정했는지에 대한 정보를 쉽게 보여주고싶지 않다. 따라서 _변수를 이용하여 캡슐화를 한 형태이다.
class SoftwareEngineer:
def __init__(self, name, age):
self.name = name
self.age = age
self._salary = None
self._num_bugs_solved = 0
se = SoftwareEngineer("Max", 25)
print(se.name, se.age)
캡슐화를 한 변수에 접근하는 getter과 설정하는 setter 함수를 작성해야한다.
class SoftwareEngineer:
def __init__(self, name, age):
self.name = name
self.age = age
self._salary = None
self._num_bugs_solved = 0
def code(self):
self._num_bugs_solved +=1
#getter
def get_salary(self):
return self._salary
#setter
def set_salary(self, base_value):
self._salary = self._calculate_salary(base_value)
def _calculate_salary(self, base_value):
if self._num_bugs_solved < 10:
return base_value
if self._num_bugs_solved < 100:
return base_value * 2
return base_value *3
se = SoftwareEngineer("Max", 25)
print(se.name, se.age)
for i in range(70):
se.code()
se.set_salary(6000)
print(se.get_salary())
추상화는 캡슐화의 자연스러운 확장으로 생각하면 된다. getter와 setter의 코드에서 print(se.get_salary())를 할 때 내부적인 계산과정은 생각하지 않아도 된다. 내부적으로 어떻게 돌아가는지 외부에 노출하지않아서 구현하는 것을 추상화라고 한다. 즉 몰라도 되는 정보는 가리고, 꼭 알아야하는 정보만 나타내는 것을 의미한다.