본문 바로가기
Python

[Python] 프로퍼티 (Property) 사용하기 (1/2)

by xangmin 2022. 4. 7.
반응형

파이썬에서 사용되는 프로퍼티 (Property)에 대해 알아보자.

 

class Citizen:
    def __init__(self, age_value):
        self._age = age_value

    def get_age(self):
        print("나이를 리턴합니다.")
        return self._age

    def set_age(self, age_value):
        print("나이를 새로 설정합니다.")
        self._age = age_value
        
citizen = Citizen(20)
print(citizen.get_age())
citizen.set_age(25)
print(citizen.get_age())

시민을 나타내는 Citizen 클래스이다. Citizen 클래스는 _age 라는 나이를 나타내는 인스턴스 변수와 get_age, set_age라는 인스턴스 메소드를 가지고 있다.

 

get_age 메소드는 _age 의 값을 리턴하고, set_age메소드는 _age의 값을 설정한다. 

여기서 그냥 age라고 하지 않고 언더바(_)를 붙여 _age로 쓴 이유는 캡슐화 때문이다. 추후에 캡슐화에서 설명할 예정이다.

 

실행결과는 아래와 같다.

나이를 리턴합니다.
20
나이를 새로 설정합니다.
나이를 리턴합니다.
25

 

프로퍼티(Property)는 데코레이터 함수이다. 

프로퍼티를 적용한 Citizen클래스의 예를 보자.

class Citizen:
    def __init__(self, age_value):
        self.age = age_value

    @property
    def age(self):
        print("나이를 리턴합니다.")
        return self._age

    @age.setter
    def age(self, age_value):
        print("나이를 새로 설정합니다.")
        self._age = age_value

Citizen클래스가 조금 바뀌었다. 일단 get_age, set_age 메소드 내용은 그대로지만, 그 헤더(header)들이 변했다.

@property
def age(self):
    print("나이를 리턴합니다.")
    return self._age

이 함수의 바디(Body) 부분은 get_age의 바디과 같다. 하지만 그 헤더 부분이 다르다. 함수의 이름이 age이고 그 위에 @property 이렇게 데코레이터 표시가 붙어있다. 프로퍼티가 적용된 Citizen 클래스를 사용해보자.

class Citizen:
    def __init__(self, age_value):
        self._age = age_value

    @property
    def age(self):
        print("나이를 리턴합니다.")
        return self._age

    @age.setter
    def age(self, age_value):
        print("나이를 새로 설정합니다.")
        self._age = age_value


citizen = Citizen(20)
print(citizen.age)

출력 결과는 아래와 같다.

나이를 리턴합니다.
20

 

지금 Citizen 클래스에는 _age 변수는 있어도 age 변수는 없다. 하지만 에러가 발생하지 않고 잘 실행된다. Citizen 클래스의 메소드 중 이름 위에 @property 표시가 붙어있던 age 메소드가 실행된 것을 알 수 있다. 이것이 프로퍼티의 기능이다.

 

citizen.age 같은 코드를 실행할 때 새로운 의미를 부여한다는 뜻이다. 원래 이 부분은 Citizen이라는 인스턴스의 age라는 변수 값을 가져온다는 뜻이다. 하지만 저렇게 age라는 함수 이름 위에 프로퍼티를 붙이면 citizen.age 코드의 의미가 Citizen 인스턴스의 age라는 메소드를 실행하겠다는 것으로 바뀐다.

지금 age 메소드는 원래 있었던 get_age 메소드와 그 내용이 같다. Citizen 클래스의 get_age 메소드와 바뀐 Citizen 클래스의 @property가 붙은 age 메소드를 비교하면 같다는 것을 알 수 있다.

@property를 붙인 메소드는 일반적으로 어떤 인스턴스 변수에 대한 getter 메소드임을 나타낸다.

 

정리하자면 age라는 메소드는 _age라는 인스턴스 변수의 getter 역할을 하는 메소드이고 원래 우리가 변수의 값을 가져올 때 사용하는 citizen.age 같은 구문이 프로퍼티(@property)로 인해 age메소드를 실행하는 걸로 의미가 바뀌어 실행된다는 것이다. 

 

출처 : https://blog.naver.com/codeitofficial/221684462326

반응형

댓글