캡슐화를 통해서 내부에 있는 변수에 대한 접근은 막아준다. 파이썬에서는 _를한번만 사용하여 변수를 정의하는 것을 선호한다.(PEP8) __가 된다면 완전히 접근을 막기 때문에 유연한 프로그램(테스팅에서 사용)을 할 수 없다. _가 들어간 변수라면 테스팅할때 사용하는 것은 괜찮지만 실제 작성하는 코딩에서는 무조건 직접 언급하는것을 피해야한다.

  1. _x는 보호되는 속성이라고 불린다.
  2. __x는 비공개 속성이라고 불린다.

아래의 코드를 보면 연봉과 몇개의 버그를 수정했는지에 대한 정보를 쉽게 보여주고싶지 않다. 따라서 _변수를 이용하여 캡슐화를 한 형태이다.

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

캡슐화를 한 변수에 접근하는 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())를 할 때 내부적인 계산과정은 생각하지 않아도 된다. 내부적으로 어떻게 돌아가는지 외부에 노출하지않아서 구현하는 것을 추상화라고 한다. 즉 몰라도 되는 정보는 가리고, 꼭 알아야하는 정보만 나타내는 것을 의미한다.