파이썬의 @property 기능

파이썬의 @property 기능

Python
파이썬의 @property 기능
Author

gabriel yang

Published

October 2, 2024


파이썬의 @property 데코레이터는 클래스의 속성을 더욱 직관적으로 사용하고, 속성 접근 시 추가적인 로직을 추가하고 싶을 때 유용합니다. @property를 사용하면 클래스 내에서 메서드를 속성처럼 사용할 수 있어, 사용자에게는 메서드 호출이 아닌 속성 접근처럼 보이지만, 실제로는 메서드가 호출되는 방식입니다.

1. @property를 사용하는 이유

1.1. 캡슐화 (Encapsulation)

파이썬에서는 클래스 내부의 데이터를 보호하는 캡슐화가 중요합니다. 직접적으로 속성에 접근하는 대신, 특정 로직을 통해 속성을 제어할 수 있게 만드는 것이 좋습니다. @property를 사용하면 속성을 안전하게 보호하면서도, 속성에 접근하는 것처럼 자연스러운 인터페이스를 제공할 수 있습니다.

1.2. 메서드를 속성처럼 사용

일반적으로 메서드를 호출할 때는 괄호 ()를 사용하지만, @property를 사용하면 메서드를 속성처럼 사용할 수 있습니다. 이렇게 하면 더 간결하고 직관적인 코드를 작성할 수 있습니다. 예를 들어, 복잡한 계산이 필요한 값을 속성처럼 사용하고자 할 때 유용합니다.

1.3. 게터(getter)와 세터(setter)

@property는 게터와 세터 기능을 구현하는 데도 사용됩니다. 속성의 값을 읽을 때와 쓸 때 다른 로직을 적용해야 할 경우, @property와 함께 @속성.setter를 사용하여 값을 제어할 수 있습니다.

  • @property 데코레이터: 클래스 메서드를 속성처럼 사용할 수 있게 합니다.
  • @속성.setter 데코레이터: 속성 값을 설정할 때 특정 로직을 추가할 수 있습니다.
  • @속성.getter 데코레이터: 속성 값을 확인할 때 특정 로직을 추가할 수 있습니다.
  • @속성.deleter 데코레이터: 속성 삭제 시 특정 로직을 추가할 수 있습니다 (필요 시).

2. @property 사용 방법

2.1. 기본적인 사용

@property는 클래스 내의 메서드에 적용하여, 해당 메서드를 속성처럼 사용할 수 있게 합니다.

예제 1: @property를 사용한 간단한 클래스

class Circle:
    def __init__(self, radius):
        self._radius = radius  # 내부 속성

    @property
    def radius(self):
        return self._radius  # 게터: _radius를 반환

    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError("반지름은 0보다 커야 합니다.")  # 유효성 검사
        self._radius = value  # 세터: _radius 값을 설정

    @property
    def area(self):
        return 3.1416 * (self._radius ** 2)  # 원의 넓이를 반환하는 속성

# Circle 인스턴스 생성
circle = Circle(5)

# radius 속성 읽기
print(circle.radius)  # 5

# radius 속성 변경
circle.radius = 10

# area 속성 읽기
print(circle.area)  # 314.16

# 반지름을 음수로 설정하려고 하면 오류 발생
# circle.radius = -3  # ValueError: 반지름은 0보다 커야 합니다.

코드 설명:

  1. radius 속성:
    • @property를 사용하여 radius 메서드를 속성처럼 사용합니다. 이 메서드는 내부 _radius 값을 반환합니다.
    • @radius.setter를 사용하여 radius 값을 설정할 때, 유효성 검사를 추가했습니다. 반지름이 음수일 경우 오류가 발생합니다.
  2. area 속성:
    • area는 원의 넓이를 계산하는 속성입니다. @property를 사용하여 메서드 호출 없이 circle.area로 넓이를 계산할 수 있습니다.

2.2. @property로 속성 보호

@property는 직접적으로 속성에 접근하지 않으면서도 값을 간접적으로 제어할 수 있어, 속성 보호의 역할을 합니다.

예제 2: 속성 보호 및 계산된 속성

class Employee:
    def __init__(self, first_name, last_name, salary):
        self.first_name = first_name
        self.last_name = last_name
        self._salary = salary

    @property
    def salary(self):
        return self._salary

    @salary.setter
    def salary(self, value):
        if value < 0:
            raise ValueError("급여는 0보다 커야 합니다.")
        self._salary = value

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"

# Employee 인스턴스 생성
emp = Employee("John", "Doe", 50000)

# 급여 속성 읽기
print(emp.salary)  # 50000

# 급여 속성 변경
emp.salary = 60000

# full_name 속성 읽기
print(emp.full_name)  # John Doe

코드 설명:

  1. salary 속성:
    • @property를 사용하여 salary 값을 간접적으로 관리하고, @salary.setter를 통해 급여 값에 대한 유효성 검사를 진행합니다.
  2. full_name 속성:
    • full_namefirst_namelast_name을 조합해 완전한 이름을 반환합니다. 이 값을 저장하는 대신 필요할 때마다 계산하여 반환합니다.

3. @property의 작동 방식

  • @property 데코레이터: 클래스 메서드를 속성처럼 사용할 수 있게 합니다.
  • @속성.setter 데코레이터: 속성 값을 설정할 때 특정 로직을 추가할 수 있습니다.
  • @속성.deleter 데코레이터: 속성 삭제 시 특정 로직을 추가할 수 있습니다 (필요 시).

4. @property와 메서드의 차이

  • 일반 메서드:
    • 메서드는 circle.get_radius()와 같은 방식으로 호출해야 하며, 괄호 ()가 필요합니다.
    • 속성을 보호하고자 할 때 메서드를 많이 사용하지만, 코드가 직관적이지 않을 수 있습니다.
  • @property 메서드:
    • @property를 사용하면 circle.radius와 같은 방식으로 속성을 호출할 수 있어, 더 직관적이고 코드가 깔끔해집니다.
    • 속성처럼 보이지만 내부적으로 메서드가 실행되어 추가적인 로직을 수행할 수 있습니다.

5. 결론

파이썬의 @property는 클래스를 더욱 직관적이고 안전하게 설계할 수 있도록 돕는 강력한 기능입니다. 이를 통해 메서드를 속성처럼 사용할 수 있으며, 속성 접근 시 추가적인 로직을 적용하거나 값을 보호할 수 있습니다. @property@속성.setter를 적절히 활용하면, 코드의 가독성을 높이고 유지 보수성을 향상시킬 수 있습니다.

@property를 적절히 활용하여 속성의 접근 방식을 개선해보세요!