파이썬의 @property 기능
파이썬의 @property 기능
파이썬의 @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(5)
circle
# radius 속성 읽기
print(circle.radius) # 5
# radius 속성 변경
= 10
circle.radius
# area 속성 읽기
print(circle.area) # 314.16
# 반지름을 음수로 설정하려고 하면 오류 발생
# circle.radius = -3 # ValueError: 반지름은 0보다 커야 합니다.
코드 설명:
radius
속성:@property
를 사용하여radius
메서드를 속성처럼 사용합니다. 이 메서드는 내부_radius
값을 반환합니다.@radius.setter
를 사용하여radius
값을 설정할 때, 유효성 검사를 추가했습니다. 반지름이 음수일 경우 오류가 발생합니다.
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 인스턴스 생성
= Employee("John", "Doe", 50000)
emp
# 급여 속성 읽기
print(emp.salary) # 50000
# 급여 속성 변경
= 60000
emp.salary
# full_name 속성 읽기
print(emp.full_name) # John Doe
코드 설명:
salary
속성:@property
를 사용하여salary
값을 간접적으로 관리하고,@salary.setter
를 통해 급여 값에 대한 유효성 검사를 진행합니다.
full_name
속성:full_name
은first_name
과last_name
을 조합해 완전한 이름을 반환합니다. 이 값을 저장하는 대신 필요할 때마다 계산하여 반환합니다.
3. @property
의 작동 방식
@property
데코레이터: 클래스 메서드를 속성처럼 사용할 수 있게 합니다.@속성.setter
데코레이터: 속성 값을 설정할 때 특정 로직을 추가할 수 있습니다.@속성.deleter
데코레이터: 속성 삭제 시 특정 로직을 추가할 수 있습니다 (필요 시).
4. @property
와 메서드의 차이
- 일반 메서드:
- 메서드는
circle.get_radius()
와 같은 방식으로 호출해야 하며, 괄호()
가 필요합니다. - 속성을 보호하고자 할 때 메서드를 많이 사용하지만, 코드가 직관적이지 않을 수 있습니다.
- 메서드는
@property
메서드:@property
를 사용하면circle.radius
와 같은 방식으로 속성을 호출할 수 있어, 더 직관적이고 코드가 깔끔해집니다.- 속성처럼 보이지만 내부적으로 메서드가 실행되어 추가적인 로직을 수행할 수 있습니다.
5. 결론
파이썬의 @property
는 클래스를 더욱 직관적이고 안전하게 설계할 수 있도록 돕는 강력한 기능입니다. 이를 통해 메서드를 속성처럼 사용할 수 있으며, 속성 접근 시 추가적인 로직을 적용하거나 값을 보호할 수 있습니다. @property
와 @속성.setter
를 적절히 활용하면, 코드의 가독성을 높이고 유지 보수성을 향상시킬 수 있습니다.
@property
를 적절히 활용하여 속성의 접근 방식을 개선해보세요!