캡슐화란?
캡슐화: 데이터와 데이터를 조작하는 메서드를 하나의 단위로 묶는 것
- 사용자가 변수와 메소드에 직접 접근하여 데이터를 변경하는 행위로부터 내부 상태를 보호하고,
외부에서의 직접적인 접근을 제한하여 무결성을 유지 → 코드의 유지보수성을 높이고 가독성 향상
자바와 같이 private 키워드와 같은 외부통제 기법은 없지만
파이썬은 1. private 변수 개념 2. protected 멤버 개념을 통해 캡슐화를 할 수 있다.
Private 변수, Protected 멤버
▶private 변수: 클래스 내부의 변수를 외부에서 사용하는 것을 막기 위해 인스턴스 변수 이름을 __<변수명> 형태로 선언
파이썬은 클래스 내부에서 변수 이름 앞에 __를 붙이면 내부적으로 변수 이름을 '_클래스명__변수명' 꼴로 변경.
이를 네임 맹글링(name mangling)이라 한다.
protected 멤버와 달리 클래스 외부에서 접근할 수 없다.('_클래스명__변수명'으로 구질구질하게 접근하지 않는 이상..)
MyClass라는 클래스에 __num이란 프라이빗 변수가 있으면 실제 변수 이름은 _MyClass__num이므로
클래스 외부에서 num이란 변수에 접근하기 위해선 '_클래스명__변수명__' 형식으로 직접 접근해야하므로
완전히 외부접근을 차단하지는 않지만 필요한 경우에만 명시적으로 접근하도록 하여 내부 객체를 보호한다.
▶protected 멤버: '_클래스명__변수명'에서 클래스명 앞에 붙는_와 같이 변수나 메서드,클래스명 앞에 _를 하나 붙여
클래스 외부에서 직접호출되지 않고자하는 관례적 표현(실제 내부 보호 효과가 있는 것이 아님).
클래스 내부 및 하위 클래스에서만 접근 가능함을 나타낸다.
class Base:
def __init__(self):
# Protected member 표현
self._number1 = 1
# Derived Class 생성
class Derived(Base):
def __init__(self):
# Base Class 생성자 호출
Base.__init__(self)
print("Calling protected member of base class: ")
print(self._number1)
obj1 = Derived()
obj2 = Base()
print(obj2.number1) #오류 발생
위의 코드를 실행시켜보면 protected member인 _number1이 별도의 효과가 있는 것이 아니라,
당연히 _number1과 number1은 엄연히 다른 변수이기 때문에 마지막 줄의 number1을 찾을 수가 없어서 오류가 발생
게터, 세터
게터(getter): 클래스 내부의 속성에 직접 접근하는 대신 값을 읽어주는(반환하는) 메소드
보통 메소드명을 get_<속성>과 같이 지어서 return self._<속성>을 통해 반환한다.
세터(setter): 외부에서 클래스 내부의 속성 값을 설정하기 위한 메소드
보통 메소드명을 set_<속성>과 같이 짓고 파라미터로 (self,new_<속성>)을 받아서
self._<속성> = new_<속성>으로 값을 새로 설정한다.
프로퍼티: 데코레이터 @property와 @<속성>.setter을 통해 게터와 세터를 정의한다.
@property를 통해 특정 속성에 대한 게터를 만들고 나면 그 속성에 대한 세터를 @<속성>.setter를 통해 만들 수 있는 것이다.
class MyClass:
def __init__(self):
self._value = None
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
참고 사이트
'Lauguage > Python' 카테고리의 다른 글
[Python] 상속과 다형성 (0) | 2024.06.16 |
---|---|
[Python] 동시성 관리 (1) | 2024.06.15 |
[Python] GIL (Global Interpreter Lock) (0) | 2024.06.11 |
[Python] [혼자 공부하는 파이썬] Chapter 8. 클래스 (0) | 2024.06.10 |
[Python] [혼자 공부하는 파이썬] Chapter 6-7 예외처리, 모듈 (1) | 2024.06.08 |