Introduction to encapsulation in Python
캡슐화는 추상화, 캡슐화, 상속 및 다형성을 포함한 객체 지향 프로그래밍의 네 가지 기본 개념 중 하나입니다.
캡슐화는 단일 개체 내에서 해당 데이터에 대해 작동하는 데이터 및 함수의 packing입니다. 이렇게 하면 개체의 내부 상태를 외부에서 숨길 수 있습니다. 이를 정보 은닉이라고 합니다.
클래스는 캡슐화의 예입니다. 클래스는 데이터와 메서드를 단일 단위로 묶습니다. 그리고 클래스는 메서드를 통해 해당 속성에 대한 액세스를 제공합니다.
정보 숨기기의 개념은 외부에 보이지 않는 속성이있는 경우 해당 값에 대한 액세스를 제어하여 객체가 항상 유효한 상태를 갖도록 할 수 있다는 것입니다.
캡슐화 개념을 더 잘 이해하기 위해 예를 살펴보겠습니다.
Python encapsulation example
다음은 Counter 클래스를 정의합니다.
class Counter:
def __init__(self):
self.current = 0
def increment(self):
self.current += 1
def value(self):
return self.current
def reset(self):
self.current = 0
Counter 클래스에는 current라는 속성이 하나 있으며 기본값은 0입니다. 그리고 세 가지 방법이 있습니다.
- increment()는 현재 속성의 값을 1씩 늘립니다.
- value()는 현재 속성의 현재 값을 반환합니다.
- reset()은 현재 속성의 값을 0으로 리셋합니다.
다음은 Counter 클래스의 새 인스턴스를 만들고 카운터의 현재 값을 화면에 표시하기 전에 increment() 메서드를 세 번 호출합니다.
counter = Counter()
counter.increment()
counter.increment()
counter.increment()
print(counter.value()) # 3
완벽하게 작동하지만 한 가지 문제가 있습니다.
Counter 클래스 외부에서 현재 속성에 액세스하여 원하는 대로 변경할 수 있습니다. 예를 들어:
counter = Counter()
counter.increment()
counter.increment()
counter.current = -999
print(counter.value()) # -999
이 예제에서는 Counter 클래스의 인스턴스를 만들고 increment() 메서드를 두 번 호출한 다음 현재 속성의 값을 잘못된 값 -999로 설정합니다.
그렇다면 현재 속성이 Counter 클래스 외부에서 수정되는 것을 어떻게 방지 할 수 있습니까?
그렇기 때문에 private 속성이 작용합니다.
Private attributes
다른언어에서
private 속성은 클래스의 메서드에서만 액세스할 수 있습니다. 즉, 클래스 외부에서 액세스할 수 없습니다.
파이썬에는
private 속성의 개념이 없습니다. 즉, 모든 속성은 class 외부에서 액세스 할 수 있습니다.
규칙에 따라 접두사로 단일 밑줄(_)을 앞에 붙여 private 속성을 정의할 수 있습니다.
_attribute
즉, _attribute는 조작, 변경해서는 안됨을 의미한다.
다음은 규칙에 따라 current를 private 속성으로 사용하는 Counter 클래스를 다시 정의합니다.
class Counter:
def __init__(self):
self._current = 0
def increment(self):
self._current += 1
def value(self):
return self._current
def reset(self):
self._current = 0
Name mangling with double underscores
속성 이름 앞에 이중 밑줄(__)을 붙이는 경우:
__attribute
파이썬은 자동으로 __attribute의 이름을 다음과 같이 변경 저장한다.
_class__attribute
이것을 파이썬에서 name mangling 이라고 부른다.
이렇게하면 다음과 같은 클래스 외부에서 직접 __attribute에 액세스 할 수 없습니다.
instance.__attribute
그러나 여전히 _class__attribute 이름을 사용하여 액세스할 수 있습니다.
instance._class__attribute
다음 예제에서는 __current 속성을 사용하여 Counter 클래스를 다시 정의합니다.
class Counter:
def __init__(self):
self.__current = 0
def increment(self):
self.__current += 1
def value(self):
return self.__current
def reset(self):
self.__current = 0
이제 __current 속성에 직접 액세스하려고하면 오류가 발생합니다.
counter = Counter()
print(counter.__current)
Output:
AttributeError: 'Counter' object has no attribute '__current'
그러나 다음과 같이 __current 속성에 _Counter___current로 액세스 가능하다.
counter = Counter()
print(counter._Counter__current)
Summary
- 캡슐화는 데이터와 메서드를 클래스로 압축하여 정보를 숨기고 외부로부터의 액세스를 제한할 수 있도록 하는 것입니다.
- 속성 앞에 단일 밑줄(_)을 붙여서 규칙에 따라 private(비공개)로 만듭니다.
- 속성 앞에 이중 밑줄(__)을 붙여서 name mangling을 사용합니다.
'Python Object-oriented Programming' 카테고리의 다른 글
__repr__ Method (0) | 2023.04.03 |
---|---|
__str__ Method (0) | 2023.04.03 |
Instance Variables (0) | 2023.04.03 |
__init__ Method (0) | 2023.04.03 |
Class Methods (0) | 2023.04.02 |
댓글