본문 바로가기

라이브러리

[파이썬] Static method, Class method 에 대해서

파이썬에서는 객체 지향 프로그래밍 개념을 지원하며, 클래스(class)와 메소드(method)를 활용하여 객체를 생성하고 다룰 수 있습니다. 이 중에서도 static 메소드와 class 메소드는 특별한 기능을 수행하는 메소드입니다.


1. Static 메소드


Static 메소드는 클래스에서 직접 호출할 수 있는 메소드입니다. 즉, 객체를 생성하지 않고 클래스의 이름을 통해 호출할 수 있습니다. static 메소드는 일반적으로 클래스 변수나 클래스와 관련된 기능을 구현합니다. static 메소드는 다음과 같이 정의됩니다.

 

class MyClass:
    @staticmethod
    def my_static_method(arg1, arg2, ...):
        # static method body


@staticmethod 데코레이터를 사용하여 정적 메소드를 정의합니다. 이 때 첫 번째 인수로는 메소드를 호출할 때 인자를 전달하지 않는 것을 보장하는 것이 좋습니다. 일반적으로 첫 번째 인자로 cls 대신 self를 사용합니다.


2. Class 메소드


Class 메소드는 클래스에서 호출되지만, 클래스 변수와 관련된 기능을 수행하기 위해서는 객체가 필요합니다. 따라서 class 메소드는 클래스 변수와 관련된 기능을 수행하면서도, 객체를 생성하지 않고도 클래스 변수에 접근할 수 있습니다. 다음과 같이 class 메소드를 정의합니다.

 

class MyClass:
    @classmethod
    def my_class_method(cls, arg1, arg2, ...):
        # class method body


@classmethod 데코레이터를 사용하여 클래스 메소드를 정의합니다. cls 인자는 클래스를 나타냅니다.


3. 예제 코드

 

class Car:
    wheels = 4

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def drive(self):
        print(f"{self.make} {self.model} is driving with {self.wheels} wheels")

    @staticmethod
    def make_car_sound():
        print("Beep Beep")

    @classmethod
    def get_number_of_wheels(cls):
        return cls.wheels

car1 = Car("Ford", "Mustang", 2021)
car1.drive() # Ford Mustang is driving with 4 wheels

Car.make_car_sound() # Beep Beep

print(Car.get_number_of_wheels()) # 4
print(car1.get_number_of_wheels()) # 4


위 예제에서는 Car 클래스를 정의하고, 이 클래스에 인스턴스 변수와 메소드, 그리고 static 메소드와 class 메소드를 함께 사용합니다.

Car 클래스는 init 메소드를 통해 make, model, year 세 개의 인스턴스 변수를 생성합니다. drive 메소드는 인스턴스 변수를 사용하여 자동차의 운행을 출력합니다.

make_car_sound 메소드는 @staticmethod 데코레이터를 사용하여 정적 메소드로 정의됩니다. 이 메소드는 Car 클래스와 관련된 소리를 출력합니다. 이 메소드는 클래스에서 직접 호출되기 때문에, 클래스 이름을 통해 접근합니다.

get_number_of_wheels 메소드는 @classmethod 데코레이터를 사용하여 클래스 메소드로 정의됩니다. 이 메소드는 클래스 변수인 wheels 값을 반환합니다. 이 메소드는 클래스와 관련된 기능을 수행하면서도, 클래스 변수를 참조하기 위해서 인스턴스를 생성하지 않아도 됩니다. 클래스 메소드는 인스턴스나 클래스 이름을 통해 호출할 수 있습니다.

마지막으로 예제에서는 인스턴스 변수와 클래스 변수의 차이를 보여주기 위해, car1 인스턴스를 생성하고, car1.get_number_of_wheels() 메소드를 호출하여 wheels 값인 4를 반환합니다. 클래스에서도 동일한 결과를 얻을 수 있습니다.