캡슐화

김엣취·2024년 8월 1일

Python

목록 보기
8/9

비공개 변수

캡슐화의 역할

실제 구현 내용 일부를 외부에 감추어 은닉함

  1. 인스턴스 변수 앞에 __을 붙이면 외부로부터 숨길 수 있다.
  2. 프라이빗을 쓴 경우, 접근과 변경하는 메서드를 따로 만들면 접근과 변경이 가능해짐. (getter과 setter)
  3. 프라이빗까지 쓰고, 굳이 접근과 변경하는 메서드를 만드는 이유는
    예외처리를 쉽게 할 수 있기 때문
  4. 예외처리를 하면 어디가 문제인지 쉽게 알 수 있음.

캡슐화의 효능

변수를 불변형으로 만들면 동시성 프로그래밍(멀티스레드처럼 복잡할 때)일 때의 문제(잘못된 값을 주입할 가능성과 변수의 값을 언제 바꿨는지 모를 때 등등)를 많이 해결 할 수 있음

_와 __의 차이

__변수 = 프라이빗 변수
_변수 = 암묵적 캡슐화

*암묵적 캡슐화

사실 인터넷에 있는 여러 파이썬 코드를 보시면
self.__반지름이 아니라
self._반지름으로 언더바를 하나만 붙인 코드도 많이 볼 수 있습니다.

이는 "암묵적 캡슐화"라고 부릅니다.
파이썬은 기본적으로 개발자들끼리
"이름 앞에 _가 붙어 있는 것은, 클래스 외부에서 만지지 않는다"라는
암묵적인 규칙이 있습니다.
그래서 이런 암묵적 규칙을 사용해서 캡슐화 하는 경우도 있습니다.

getter 위에는 @property, setter 위에는 @인스턴스변수.setter를 쓰면함수 사용이 아닌 일반 변수를 쓰는것처럼 조회, 변경할 수 있음.

코드 전문

# 캡슐화
# 객체를 사용하는 사람이 허튼짓 못하게 변수와 함수를 숨기는 작업
# 인스턴스 변수와 인스턴스 함수 앞에 __를 붙이면
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.넓이)

0개의 댓글