본문 바로가기
개발/Python

[Python] @classmethod vs getter, setter 사용

by 보안매크로 2024. 7. 4.
728x90

Python에서 @classmethod 데코레이터를 사용하는 이유와 일반적인 getter와 setter 메소드를 사용하는 것의 차이를 알아보겠습니다.

@classmethod

@classmethod 데코레이터는 메소드가 클래스의 인스턴스가 아닌 클래스 자체에 속하도록 지정합니다. 이 메소드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있으며, 첫 번째 파라미터로 클래스 객체인 cls를 자동으로 받습니다. 이는 클래스 변수를 수정하거나 클래스 수준에서 데이터를 처리할 때 유용합니다.

예를 들어, 코드에서 get_flag와 increment_flag 메소드는 __flag라는 클래스 변수에 접근하고 수정합니다. 이 메소드들은 클래스 레벨에서 작동하기 때문에 인스턴스의 상태와 독립적으로 동작합니다.

class MyClass:
    __flag = 0

    @classmethod
    def get_flag(cls):
        return cls.__flag

    @classmethod
    def increment_flag(cls):
        cls.__flag += 1

Getter와 Setter

Getter와 Setter는 객체의 내부 상태 (즉, 인스턴스 변수)를 관리하기 위한 방법입니다. 이 메소드들은 객체의 데이터를 안전하게 읽거나 수정할 수 있는 인터페이스를 제공합니다. 일반적으로 이들은 인스턴스 레벨에서 데이터를 다루며, 각 객체 인스턴스에 대한 데이터를 개별적으로 유지합니다.

class MyClass:
    def __init__(self, value=0):
        self.__value = value

    def get_value(self):
        return self.__value

    def set_value(self, value):
        self.__value = value

 

주요 차이점

  • 수준의 차이: @classmethod는 클래스 수준에서 작동하여 모든 인스턴스에 걸쳐 공유되는 데이터에 대해 사용됩니다. 반면, getter와 setter는 각 인스턴스의 개별 속성을 다루는 데 사용됩니다.
  • 사용 사례: 클래스 메소드는 모든 인스턴스에서 공유해야 하는 설정이나 구성 같은 것들을 처리할 때 주로 사용됩니다. 반면, getter와 setter는 객체의 상태를 보호하면서 외부에서 접근을 허용할 필요가 있을 때 사용됩니다.

Python에서는 때로는 @property 데코레이터를 사용하여 인스턴스 변수에 대한 보다 깔끔한 접근을 제공하는 것이 일반적입니다. 이는 getter와 setter를 보다 세련되게 다룰 수 있게 해주며, 이를 통해 메소드를 속성처럼 보이게 할 수 있습니다.

class MyClass:
    def __init__(self, value=0):
        self.__value = value

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        self.__value = value

이러한 구조는 Pythonic하게 속성에 접근하고 수정하는 데 있어 일관된 인터페이스를 제공합니다.

728x90