캡슐화는 객체지향 프로그래밍에서 중요한 개념 중 하나로, 객체의 상태를 외부에서 직접적으로 접근하지 못하도록 보호하는 것을 말합니다. 이를 통해 객체의 내부 구현을 외부에서 숨기고, 객체가 제공하는 인터페이스를 통해 상호작용할 수 있도록 합니다. 이를 통해 코드의 안정성과 유지보수성을 높일 수 있습니다.
Python에서는 캡슐화를 구현하는 가장 간단한 방법은 클래스 내에서 멤버 변수와 멤버 메소드의 접근 제어를 통해 구현하는 것입니다. 파이썬에서는 멤버 변수와 멤버 메소드의 이름 앞에 언더스코어(_)를 붙여서 접근 제어를 구현할 수 있습니다.
1. 예제코드
다음은 캡슐화를 구현한 예시 코드입니다.
class BankAccount:
def __init__(self, name, balance):
self._name = name # _name: protected member variable
self._balance = balance # _balance: protected member variable
def deposit(self, amount):
self._balance += amount # _balance: protected member variable
def withdraw(self, amount):
if self._balance >= amount: # _balance: protected member variable
self._balance -= amount # _balance: protected member variable
else:
print("Insufficient balance!")
def get_balance(self):
return self._balance # _balance: protected member variable
def get_name(self):
return self._name # _name: protected member variable
위의 코드에서 BankAccount 클래스는 은행 계좌를 나타내는 클래스입니다. 멤버 변수인 _name과 _balance는 언더스코어(_)를 붙여서 접근 제어를 구현했습니다. 이렇게 구현하면 클래스 외부에서는 직접적으로 멤버 변수에 접근할 수 없으며, 멤버 메소드를 통해서만 값을 읽거나 변경할 수 있습니다.
예를 들어, 다음과 같이 BankAccount 객체를 생성하고 메소드를 호출해서 계좌 정보를 출력할 수 있습니다.
account = BankAccount("John", 1000)
account.deposit(500)
account.withdraw(200)
print("Account name:", account.get_name()) # Output: Account name: John
print("Account balance:", account.get_balance()) # Output: Account balance: 1300
위의 코드에서는 account 객체의 get_name() 메소드와 get_balance() 메소드를 호출해서 각각 계좌의 소유자와 잔액을 출력합니다. 이때, 멤버 변수인 _name과 _balance는 직접적으로 접근하지 않고, get_name()과 get_balance() 메소드를 통해 값을 반환합니다. 이를 통해 객체의 상태를 외부에서 보호하고, 캡슐화를 통해 객체의 내부 구현을 숨기고 인터페이스를 제공함으로써, 객체지향 프로그래밍에서 높은 수준의 모듈성과 추상화를 달성할 수 있습니다. 또한, 코드의 안정성과 유지보수성을 높일 수 있습니다. 예를 들어, 캡슐화를 구현한 클래스를 다른 클래스에서 상속받아 사용할 때, 부모 클래스의 내부 구현을 알 필요 없이 인터페이스를 통해서만 상호작용할 수 있습니다.
하지만, 캡슐화를 너무 강하게 적용하면 객체의 내부 구현을 완전히 숨기기 때문에 디버깅이 어려워지고, 유연성이 떨어질 수 있습니다. 따라서, 적절한 수준에서 캡슐화를 적용하는 것이 중요합니다.
또한, 언더스코어(_)를 붙인 멤버 변수와 멤버 메소드는 외부에서 접근 가능하지만, 이름 앞뒤에 더블 언더스코어(__)를 붙인 멤버 변수와 멤버 메소드는 파이썬에서 특별한 의미를 갖는 매직 메소드를 나타내기 때문에, 접근을 제한하기 위해서는 언더스코어(_)를 사용하는 것이 좋습니다.
'설계' 카테고리의 다른 글
[파이썬] 상속성 (Inheritance) (0) | 2023.03.23 |
---|---|
[파이썬] 레이어드 (layered) 아키텍처 (0) | 2023.03.21 |
[파이썬] 포트와 어댑터 패턴 (0) | 2023.03.21 |
[파이썬] 저장소 패턴 (Repository Pattern) 에 대해서 (0) | 2023.03.21 |
[디자인 패턴] 비지터 패턴 (Visitor Pattern) - python 예제 코드 (0) | 2023.03.11 |