본문 바로가기

설계

[파이썬] 캡슐화 (Encapsulation)

캡슐화는 객체지향 프로그래밍에서 중요한 개념 중 하나로, 객체의 상태를 외부에서 직접적으로 접근하지 못하도록 보호하는 것을 말합니다. 이를 통해 객체의 내부 구현을 외부에서 숨기고, 객체가 제공하는 인터페이스를 통해 상호작용할 수 있도록 합니다. 이를 통해 코드의 안정성과 유지보수성을 높일 수 있습니다.

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() 메소드를 통해 값을 반환합니다. 이를 통해 객체의 상태를 외부에서 보호하고, 캡슐화를 통해 객체의 내부 구현을 숨기고 인터페이스를 제공함으로써, 객체지향 프로그래밍에서 높은 수준의 모듈성과 추상화를 달성할 수 있습니다. 또한, 코드의 안정성과 유지보수성을 높일 수 있습니다. 예를 들어, 캡슐화를 구현한 클래스를 다른 클래스에서 상속받아 사용할 때, 부모 클래스의 내부 구현을 알 필요 없이 인터페이스를 통해서만 상호작용할 수 있습니다.

하지만, 캡슐화를 너무 강하게 적용하면 객체의 내부 구현을 완전히 숨기기 때문에 디버깅이 어려워지고, 유연성이 떨어질 수 있습니다. 따라서, 적절한 수준에서 캡슐화를 적용하는 것이 중요합니다.

또한, 언더스코어(_)를 붙인 멤버 변수와 멤버 메소드는 외부에서 접근 가능하지만, 이름 앞뒤에 더블 언더스코어(__)를 붙인 멤버 변수와 멤버 메소드는 파이썬에서 특별한 의미를 갖는 매직 메소드를 나타내기 때문에, 접근을 제한하기 위해서는 언더스코어(_)를 사용하는 것이 좋습니다.