본문 바로가기

Programming/Python

[Python] 객체지향에서 필수 개념인 Property, Getter, Setter 간단히 알아보기

반응형

키워드 : 은닉화 (객체의 속성과 행위를 하나로 묶고, 구현된 일부를 감추어 은닉)

property, getter, setter은 클래스 인스턴스의 내부에서 데이터를 안전하게 접근하기 위해 사용하는 키워드이며, 객체지향 프로그래밍에서 흔히 볼수 있는 패턴이다.

  • getter : 데이터를 읽어주는 메서드
  • setter : 데이터를 변경해주는 메서드

⇒ 파이썬의 내장 함수는 property() 메서드를 사용하면 깔끔하게 getter, setter 메서드를 호출할 수 있으며, 여기서 내장 데코레이터인 '@property'를 활용할 수 있다.

[property]

: 인스턴스 변수 값을 사용해서 적절한 값으로 보낼 때

: 인스턴스 변수 값에 대한 유효성 검사 및 수정

예제

__변수명 : 클래스 인스턴스 내부에서만 접근할 수 있음

setter을 정의할 때는 데코레이터 property을 통해 정의한 메서드인 get_age를 적어주고 .setter를 덧붙이면 된다.

setter 메서드 : '@<필드명>.setter

이를 통해 내부에서만 접근할 수 있는 은닉 환경이 형성된다.

 

class Car:
    """
    Car Class
    """

    __count = 0

    def __init__(self, name, age):
        self.__name = name  # 클래스 인스턴스 내부에서만 접근이 가능한 변수
        self.__age = age
        Car.__count += 1

    @property
    def get_name(self):
        return f"Hyundai {self.__name}"

    @property
    def get_age(self):
        return self.__age

    @get_age.setter
    def set_age(self, new_age):
        if new_age < 0:
            raise ValueError("Invalid age")
        else:
            self.__age = new_age


my_car = Car("Nyyang", 10)

# print(my_car.age)   # AttributeError: 'Car' object has no attribute 'age'

print(my_car.get_name)
print(my_car.get_age)
# my_car.set_age = -20  # ValueError: Invalid age
my_car.set_age = 20
print(my_car.get_age)


# 출력
Hyundai Nyyang
10
20

 

 

간단 정리

클래스는 설계도이다. 이 설계도를 통해 각각의 인스턴스들을 생성할 수 있다.

a = Bike()

b = Bike()

..

 

이렇게 클래스로부터 인스턴스를 생성한 이후, 클래스 인스턴스 내부에서 데이터를 안전하게 접근하기 위해서는 Getter, Setter을 사용하는게 OOP에서 관례이다.

 

왜냐하면, self.name = name, self.age = age 이런 식으로 정의를 하게 되면 외부에서 누구나 접근 가능하며 임의로 값을 수정할 수 있다.

 

고로, 안전하게 데이터에 접근 및 호출하기 위해 Getter, Setter 메서드를 사용하며, Property 데코레이터를 활용하는 것이 좋다.

반응형