새소식

반응형
Python/Clean Code Series(클린코드)

파이썬 Getter & Setter: 데이터 보호의 수호자

  • -
반응형

about python girl image generated by AI

프로그래밍에서 데이터의 무결성을 유지하는 것은 매우 중요합니다.

 

특히, 클래스 내부의 속성(데이터)이 외부에서 직접 변경될 경우, 원하지 않는 값이 설정되어 프로그램이 예상치 못한 동작을 할 수 있습니다. 이를 방지하기 위해 Getter(게터)와 Setter(세터) 를 사용합니다.

 

Getter와 Setter는 클래스 내부의 private(비공개) 속성에 접근하거나 값을 변경하는 메서드입니다. 이를 활용하면 데이터를 안전하게 보호하면서도 필요한 경우 외부에서 값을 읽고 수정할 수 있도록 허용할 수 있습니다.

Getter & Setter를 사용해야 하는 이유

  1. 데이터 보호: 직접 속성에 접근하는 것을 방지하고, 유효한 값만 설정되도록 제한할 수 있습니다.
  2. 내부 구현 변경 가능: 클래스 내부 구조가 변경되더라도 Getter와 Setter를 통해 외부 코드의 영향을 최소화할 수 있습니다.
  3. 유효성 검사: 올바르지 않은 값이 설정되지 않도록 검증하는 로직을 추가할 수 있습니다.

Getter & Setter를 사용하지 않은 경우

class BankAccount:
    def __init__(self, initial_balance):
        self.balance = initial_balance  # balance 속성을 직접 설정

# 사용 예시
account = BankAccount(100)
account.balance = -50  # 부정확한 값 입력 가능

위 코드에서는 balance 속성이 직접 접근 가능하기 때문에 잘못된 값(-50)을 설정할 수 있습니다. 은행 계좌의 잔액이 음수가 되는 것은 비정상적인 상황이므로, 이를 방지할 필요가 있습니다.


Getter & Setter 사용하기

Python에서는 @property 데코레이터를 활용하여 좀 더 파이썬다운 방식(Pythonic way) 으로 Getter와 Setter를 구현할 수 있습니다.

class BankAccount:
    def __init__(self, initial_balance):
        self._balance = None  # 비공개 속성
        self.balance = initial_balance  # Setter 호출

    @property
    def balance(self):
        """
        Getter 메서드: balance 값을 반환하는 역할을 합니다.
        `@property` 데코레이터를 사용하면 메서드를 속성처럼 접근할 수 있습니다.
        예: account.balance (괄호 없이 호출 가능)
        """
        return self._balance  # Getter 역할

    @balance.setter
    def balance(self, new_balance):
        """
        Setter 메서드: balance 값을 설정하는 역할을 합니다.
        `@balance.setter` 데코레이터를 사용하면 속성을 직접 할당하는 것처럼 값을 설정할 수 있습니다.
        예: account.balance = 200
        """
        if new_balance < 0:
            raise ValueError("잔액은 0보다 작을 수 없습니다!")
        self._balance = new_balance  # Setter 역할

# 사용 예시
account = BankAccount(100)
print(account.balance)  # 100 출력

account.balance = -50  # ValueError 발생: 잔액은 0보다 작을 수 없습니다!

✅ @property와 @balance.setter의 역할

  • @property: 메서드를 속성처럼 사용할 수 있도록 변환해줍니다. 즉, account.balance() 대신 account.balance처럼 호출할 수 있습니다.
  • @balance.setter: 속성 값을 설정할 때 특정 로직(유효성 검사 등)을 추가할 수 있도록 합니다. 이 경우, account.balance = 값을 할당할 때 Setter 메서드가 실행됩니다.

이제 balance 속성을 직접 수정할 수 없으며, 반드시 Setter를 통해 값을 변경해야 합니다. 즉, 데이터 무결성을 유지할 수 있습니다.

반응형

마무리

Getter와 Setter를 사용하면 클래스 내부 데이터를 안전하게 보호하고, 데이터를 변경할 때 유효성 검사를 적용할 수 있습니다. 특히, 중요한 데이터를 다루는 경우(예: 은행 계좌, 사용자 정보 등)에는 반드시 Getter와 Setter를 활용하는 것이 좋습니다.

 

💡 사용자가 직접 데이터를 수정하게 두는 것은 아기에게 자동차 키를 맡기는 것과 같습니다! 🏎️💨

Python의 @property를 활용하여 더욱 안전하고 깔끔한 코드를 작성해보세요! 🚀

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.