#02 – Encapsulation & Abstraction in Python
개요
Python 객체 지향 프로그래밍(OOP)의 핵심 개념인 캡슐화와 추상화를 다루며, 데이터 은닉, 접근 제어, 그리고 복잡한 구현 세부 사항을 숨기고 단순화된 인터페이스를 제공하는 방법에 대해 설명합니다.
주요 내용
* 캡슐화(Encapsulation): 내부 상태를 숨기고 유효성 검사나 제어된 메서드를 통해 모든 상호 작용을 요구하는 원칙입니다.
* 접근 수정자(Access Modifiers): Python은 Java나 C++와 같은 엄격한 public, private 키워드 대신 명명 규칙과 이름 맹글링(name mangling)을 사용합니다.
* Public (self.name): 클래스 내부 및 외부 어디에서든 접근 가능합니다.
* Protected (self._balance): 단일 밑줄로 시작하며, 클래스 내부 및 하위 클래스에서만 사용하도록 의도된(convention) 것입니다.
* Private (self.__pin): 이중 밑줄로 시작하며, 이름 맹글링(_ClassName__attribute)을 통해 클래스 내부에서만 접근 가능하도록 하여 외부에서의 우발적 접근이나 재정의를 어렵게 만듭니다.
* Getter & Setter (@property): get_balance(), set_balance()와 같은 verbose한 메서드 대신 @property 데코레이터를 사용하여 메서드를 일반 속성처럼 접근하면서도 유효성 검사, 읽기 전용 제약, 동적 계산 등을 제어할 수 있습니다.
* 추상화(Abstraction): 복잡한 내부 구현 세부 사항을 숨기고 사용자에게 단순화된 인터페이스만 노출하는 원칙입니다.
* 추상 기반 클래스(Abstract Base Classes, ABC): abc 모듈과 @abstractmethod 데코레이터를 사용하여 구현됩니다.
* 추상 클래스는 직접 인스턴스화할 수 없습니다.
* 구체적인 하위 클래스는 모든 @abstractmethod를 반드시 구현해야 하며, 그렇지 않을 경우 인스턴스화 시 오류가 발생합니다.
* 실습 예제: PaymentProcessor라는 추상 기반 클래스를 정의하고, CreditCardProcessor와 PayPalProcessor와 같은 구체적인 구현 클래스를 통해 결제 시스템을 설계합니다. CheckoutService는 PaymentProcessor 인터페이스를 통해 다양한 결제 방식을 추상화하여 사용합니다.
시사점
캡슐화와 추상화는 Python 코드의 유지보수성, 재사용성, 그리고 견고성을 향상시키는 데 중요한 역할을 합니다. @property를 활용한 제어된 속성 접근과 추상 기반 클래스를 통한 명확한 인터페이스 정의는 복잡한 소프트웨어 시스템을 구축하고 관리하는 데 있어 실무적으로 유용합니다.
댓글
GitHub Discussions