콘텐츠로 건너뛰기

정적 메소드란 무엇인가요? - Python으로 쉽게 이해하기

[

파이썬의 인스턴스, 클래스 및 정적 메서드 배우기

이 튜토리얼에서는 Python 3 클래스를 작성하여 인스턴스 메서드, 클래스 메서드 및 정적 메서드의 예제를 자세히 설명합니다. 이 세 가지 메서드 유형의 차이를 직관적으로 이해하면, 의도를 분명하게 전달하고 장기간 유지 관리하기 쉬운 객체 지향 Python을 작성할 수 있습니다.

인스턴스, 클래스 및 정적 메서드 개요

먼저, 인스턴스 메서드, 클래스 메서드 및 정적 메서드의 예를 포함하는 (Python 3) 클래스를 작성해보겠습니다:

class MyClass:
def method(self):
return '인스턴스 메서드가 호출되었습니다.', self
@classmethod
def classmethod(cls):
return '클래스 메서드가 호출되었습니다.', cls
@staticmethod
def staticmethod():
return '정적 메서드가 호출되었습니다.'

인스턴스 메서드

MyClass의 첫 번째 메서드는 method라는 일반적인 인스턴스 메서드입니다. 이는 대부분의 경우 사용하는 기본 메서드 유형입니다. 이 메서드는 self라는 매개변수를 사용하며, 메서드가 호출될 때 MyClass의 인스턴스를 가리킵니다 (물론 인스턴스 메서드는 하나 이상의 매개변수를 받을 수 있습니다).

인스턴스 메서드는 self 매개변수를 통해 동일한 객체의 속성 및 다른 메서드에 자유롭게 액세스할 수 있습니다. 이를 통해 객체의 상태를 수정하는데 많은 기능을 제공합니다.

또한 인스턴스 메서드는 self.__class__ 속성을 통해 클래스 자체에도 액세스할 수 있습니다. 이는 인스턴스 메서드가 클래스 상태도 수정할 수 있다는 것을 의미합니다.

클래스 메서드

두 번째 메서드인 MyClass.classmethod은 클래스 메서드로 표시하기 위해 @classmethod 데코레이터를 사용했습니다.

클래스 메서드는 self 매개변수 대신 매개변수인 cls를 사용합니다. 이 cls 매개변수는 메서드가 호출될 때 객체 인스턴스가 아닌 클래스를 가리킵니다.

클래스 메서드는 cls 인수만 사용할 수 있기 때문에 객체 인스턴스 상태를 수정할 수는 없습니다. 이는 self에 액세스할 필요가 있기 때문입니다. 그러나 클래스 메서드는 여전히 클래스 전체에 적용되는 클래스 상태를 수정할 수 있습니다.

정적 메서드

세 번째 메서드인 MyClass.staticmethod@staticmethod 데코레이터를 사용하여 정적 메서드로 표시되었습니다.

정적 메서드는 객체 인스턴스나 클래스에 액세스할 수 없습니다. 이는 정적 메서드는 독립적으로 호풀될 수 있으며, 클래스나 인스턴스의 상태를 수정할 수 없다는 것을 의미합니다.

실제 적용해보기!

이제 세 가지 메서드 유형이 어떻게 동작하는지 실제로 확인해보겠습니다. 아래 예제 코드를 실행하여 결과를 확인하세요:

my_obj = MyClass()
# 인스턴스 메서드 호출
print(my_obj.method())
# 클래스 메서드 호출
print(MyClass.classmethod())
# 정적 메서드 호출
print(MyClass.staticmethod())

위의 코드를 실행하면 다음과 같은 결과가 출력됩니다:

('인스턴스 메서드가 호출되었습니다.', <__main__.MyClass object at 0x00000123456789>)
('클래스 메서드가 호출되었습니다.', <class '__main__.MyClass'>)
'정적 메서드가 호출되었습니다.'

@classmethod를 사용한 맛있는 피자 공장

이제 @classmethod 데코레이터를 사용하여 맛있는 피자 공장을 만들어보겠습니다. 아래의 예제 코드를 실행하여 결과를 확인하세요:

class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __repr__(self):
return f'Pizza({self.ingredients})'
@classmethod
def margherita(cls):
return cls(['치즈', '토마토'])
@classmethod
def prosciutto(cls):
return cls(['치즈', ''])

위의 코드에서 Pizza 클래스는 __init__ 메서드를 통해 피자의 재료를 초기화합니다. __repr__ 메서드를 통해 피자 객체의 문자열 표현을 반환합니다.

@classmethod 데코레이터를 사용하여 margherita 메서드와 prosciutto 메서드를 정의합니다. 이들은 각각 치즈와 토마토 혹은 치즈와 햄으로 구성된 피자 객체를 생성합니다.

아래의 예제 코드를 실행하여 맛있는 피자 공장을 사용해보세요:

margherita_pizza = Pizza.margherita()
prosciutto_pizza = Pizza.prosciutto()
print(margherita_pizza)
print(prosciutto_pizza)

위의 코드를 실행하면 다음과 같은 결과가 출력됩니다:

Pizza(['치즈', '토마토'])
Pizza(['치즈', '햄'])

@classmethod를 사용하면 다른 메서드 대신 클래스 자체를 초기화하는 유용한 메서드를 생성할 수 있습니다.

정적 메서드를 사용하는 시점

정적 메서드는 클래스와 인스턴스에 액세스할 필요가 없는 독립적인 메서드를 만들기 위해 사용됩니다. 예를 들어 유틸리티 함수나 간단한 수학 연산과 같은 일부 작업을 수행할 때 정적 메서드를 사용할 수 있습니다.

정적 메서드를 사용하여 다음과 같이 원의 넓이를 계산하는 유틸리티 함수를 작성해보겠습니다:

class Circle:
def __init__(self, radius):
self.radius = radius
@staticmethod
def calculate_area(radius):
return 3.14 * (radius ** 2)

위의 코드에서 Circle 클래스는 생성자인 __init__ 메서드로 원의 반지름을 초기화합니다.

@staticmethod 데코레이터를 사용하여 calculate_area 메서드를 정의합니다. 이 메서드는 반지름을 인수로 받아 원의 넓이를 계산합니다.

아래의 예제 코드를 사용하여 원의 넓이를 계산해보세요:

circle = Circle(5)
area = Circle.calculate_area(5)
print(area)

위의 코드를 실행하면 다음과 같은 결과가 출력됩니다:

78.5

정적 메서드를 사용하면 클래스 또는 인스턴스에 액세스할 필요 없이 독립적인 작업을 수행할 수 있습니다.

정리하기

인스턴스 메서드, 클래스 메서드 및 정적 메서드는 각각 다른 용도와 특징을 가지고 있습니다.

인스턴스 메서드는 객체 인스턴스의 상태를 수정하고 객체 자체 및 클래스에 액세스할 수 있습니다.

클래스 메서드는 객체 인스턴스 상태를 수정하지 않고 클래스 자체에만 액세스할 수 있습니다.

정적 메서드는 객체 인스턴스나 클래스에 액세스할 수 없는 독립적인 메서드입니다.

이 세 가지 메서드 유형을 활용하여 객체 지향 프로그래밍에 더욱 익숙해지세요!