본문 바로가기
Base/Python

26. 캡슐화

by 귀멸 2023. 6. 29.

혼공파 82강

 

1. 캡슐화

# 캡슐화
# 객체를 사용하는 사람이 허튼짓 못하게 변수와 함수를 숨기는 작업
# 인스턴스 변수와 인스턴스 함수 앞에 __를 붙이면 외부에서 접근 불가
# 외부에서 변수 확인하지도 바꾸지도 못하게 만들기 때문에 get/set 함수를 만들어서 
# 사용할 수 있게 해주는 것!! 필요에 따라 추가한다 (getter, setter)

class Circle:
    def __init__(self, 반지름):
        if 반지름 < 0:
            raise TypeError("반지름은 0 이상이어야 합니다.")
        self.__반지름 = 반지름
        self.__파이 = 3.14
    def get_반지름(self):
        return self.__반지름
    def set_반지름(self, value):
        if value < 0:
            raise TypeError("반지름은 0 이상이어야 합니다.")
        self.__반지름 = value
    def 둘레(self):
        return 2 * self.__파이 * self.__반지름
    def 넓이(self):
        return self.__파이 * (self.__반지름 ** 2)
    
circle = Circle(10)
# circle.반지름 = -10 이런 행위 자체를 못하게 막아야 한다
print(circle.get_반지름())
circle.set_반지름(20)

print(circle.둘레()) # 둘레를 구함
print(circle.넓이()) # 넓이를 구함

# setter 같은 함수들이 비파괴적으로 동작해야한다
# (1) 스택에 있는 서로 다른 이름들이 힙에 있는 하나의 객체를 가리키면 어떤 변수가 어떤 값을 변경하는지 추적하기 어렵기 때문에 버그가 발생하면 여러부분을 확인해야 한다.
# (2) 비파괴적으로 동작해야 동시성 프로그래밍과 관련된 많은 문제를 해소할 수 있다.

# 변수와 값을 함수로 말고 본질 그대로 사용할 수 있게 하자
# 메서드에 @property 를 붙여서 사용(그 때 마다 구글링으로 뭘 붙여야하는 지 찾아볼 것)

class Circle:
    def __init__(self, 반지름):
        if 반지름 < 0:
            raise TypeError("반지름은 0 이상이어야 합니다.")
        self.__반지름 = 반지름
        self.__파이 = 3.14
    @property
    def 반지름(self):
        return self.__반지름
    @반지름.setter
    def 반지름(self, value):
        if value < 0:
            raise TypeError("반지름은 0 이상이어야 합니다.")
        self.__반지름 = value
    @property
    def 둘레(self):
        return 2 * self.__파이 * self.__반지름
    @property
    def 넓이(self):
        return self.__파이 * (self.__반지름 ** 2)
    
circle = Circle(10)
circle.반지름
circle.반지름 = 20
print(circle.둘레) # 둘레를 구함
print(circle.넓이) # 넓이를 구함

댓글