파이썬/클래스와 객체 지향

[객체 지향 프로그래밍 4개의 기둥] 캡슐화

Data Jun 2025. 3. 11. 11:17

​객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나인 **캡슐화(Encapsulation)**는 객체의 내부 상태나 동작을 외부로부터 숨기고, 필요한 인터페이스만을 공개하여 객체의 무결성과 일관성을 유지하는 것을 의미합니다. 이를 통해 코드의 유지보수성과 재사용성을 향상시킬 수 있습니다.

 

class CreditCard:
    MAX_PAYMENT_LIMIT = 30000000

    def __init__(self, name, password, payment_limit):
        self.name = name
        self._password = password
        self._payment_limit = payment_limit
        
	@property
    def password(self):
        return "비밀번호는 볼 수 없습니다"
        
    @password.setter
    def password(self, new_password):
        self._password = new_password
        
    @property
    def payment_limit(self):
    	return self._payment_limit
        
    @payment_limit.setter
    def payment_limit(self, new_payment_limit):
        if 0 <= new_payment_limit <= CreditCard.MAX_PAYMENT_LIMIT:
            self._payment_limit = new_payment_limit
        else:
            print("카드 한도는 0원 ~ 3천만 원 사이로 설정해 주세요!")
            
card = CreditCard("강영훈", "123", 100000)

print(card.name)
print(card.password)
print(card.payment_limit)

card.name = "성태호"
card.password = "1234"
card.payment_limit = -10

print(card.name)
print(card.password)
print(card.payment_limit)

 

주요 구현 사항:

  1. 비공개 속성(Private Attribute): _password와 _payment_limit은 언더스코어(_)로 시작하여 외부에서 직접 접근하지 않도록 의도하였습니다. 이는 속성의 직접적인 수정을 방지하고, 객체의 무결성을 유지하기 위함입니다.​
  2. @property 데코레이터: password와 payment_limit 메서드에 적용하여, 해당 메서드를 속성처럼 사용할 수 있게 하였습니다. 이를 통해 내부 구현을 숨기면서도 외부에서는 직관적인 인터페이스를 제공합니다.​
  3. Getter와 Setter 메서드: password와 payment_limit에 대해 각각 getter(property)와 setter를 정의하여, 속성 접근 시 추가적인 로직(예: 유효성 검사)을 수행할 수 있도록 하였습니다. 특히, payment_limit의 setter에서는 설정하려는 값이 0 이상 최대 한도 이하인지 확인하여, 유효한 값만을 허용하고 있습니다.

실행 결과:

강영훈
비밀번호는 볼 수 없습니다
100000
카드 한도는 0원 ~ 3천만 원 사이로 설정해 주세요!
성태호 비밀번호는 볼 수 없습니다
100000

 

설명:

  • card 객체를 생성하고 초기 값을 설정하였습니다.​
  • card.name은 공개 속성이므로 직접 접근 및 수정이 가능합니다.​
  • card.password는 getter를 통해 "비밀번호는 볼 수 없습니다"라는 문자열을 반환하며, setter를 통해 비밀번호를 변경할 수 있습니다. 그러나 외부에서는 실제 비밀번호 값을 확인할 수 없습니다.​
  • card.payment_limit은 getter와 setter를 통해 접근하며, setter에서는 설정하려는 값의 유효성을 검사합니다. 예시에서 -10을 설정하려 했으나, 유효성 검사에 의해 거부되고 기존 값이 유지됩니다.​

이러한 방식으로 캡슐화를 구현하면, 객체의 내부 상태를 보호하고, 잘못된 사용으로부터 객체를 안전하게 지킬 수 있습니다. 또한, 외부에는 필요한 인터페이스만을 공개하여 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.