1. 클래스 메서드 (Class Method)
아래의 코드처럼 일반적으로 클래스 내에서 함수를 정의하고 사용하는 메서드는 객체에 소속되는 인스턴스 메서드이다.
class Human:
def __init__(self, age, name):
self.age = age
self.name = name
def intro(self):
print(str(self.age) + "살 " + self.name + "입니다.")
park = Human(13, "박진명")
park.intro()
Human 클래스의 intro 메서드는 첫 번째 인수 self를 받아 이 객체에 대한 작업을 수행한다.
따라서, park 객체에 대해 호출되며, 해당 인스턴스의 나이와 이름을 조사하여 출력한다.
즉 park.intro() 메서드에서 읽는 self.age는 park의 나이가 된다.
이에 비해 클래스 메서드는 특정 객체에 대한 작업을 처리하는 것이 아니라, 클래스 전체가 공유한다.
함수 앞에 @classmethod 데코레이터를 붙이고 첫번째 인수로 클래스에 해당하는 cls인수를 받으면 클래스 메서드를 만들 수 있다.
다음은 김상형 저자의 파이썬 정복에서 발췌한 예제 코드이다.
# 클래스 정의
class Car:
count = 0
def __init__(self, name):
self.name = name
Car.count += 1
# 클래스 메서드 생성
@classmethod
def outcount(cls):
print('지금까지 총 {}대의 자동차 인스턴스가 생성되었습니다'.format(cls.count))
# 자동차 인스턴스 1개 생성
genesis = Car('제네시스')
print(Car.outcount()) # 여태까지 총 1대 생성
# 자동차 인스턴스 추가 생성
ionic = Car('아이오닉')
print(Car.outcount()) # 여태까지 총 2대 생성
eclass = Car('E클래스')
print(Car.outcount()) # 여태까지 총 3대 생성 ...
위처럼 인스턴스의 메서드 genesis.outcount(), ionic.outcount() 등을 사용하는 것이 아닌, Car 클래스의 메서드인 outcount를 사용하는 방식을 채택한다.
클래스 선언문에서 초기화한 count 변수는 Car 클래스 소속이다. 특정 객체에 소속되지 않으며 이 클래스로부터 생성되는 모든 객체가 공유한다.
최초 선언될 때 0으로 초기화하고 `__init__`에서 차를 한대 생성할 때마다 1씩 증가한다.
2. 정적 메서드 (Static Method)
정적 메서드는 클래스에 포함되는 단순한 유틸리티 메서드이다.
특정 객체에 소속되지도 않고, 클래스와 관련된 동작을 하는 것도 아니어서 따로 self 또는 cls와 같은 인수를 받지 않는다.
정의할 때 @staticmethod 데코레이터를 붙여주면 된다.
class Car:
@staticmethod
def hello():
print('오늘도 안전운전!!!')
count = 0 # class variable
# 생성자
def __init__(self, name):
self.name = name
Car.count += 1
@classmethod
def outcount(cls):
print(cls.count)
Car.hello() # 출력물: 오늘도 안전운전!!!
i30 = Car('i30')
i30.hello() # 출력물: 오늘도 안전운전!!!
위처럼 클래스나 객체와 직접적인 연관이 없고 단순히 클래스에 소속되어 있을 뿐이다.
그래서 객체가 전혀 없어도 호출할 수 있으며, 객체와 상관없는 아주 일반적인 동작만 가능하다.
클래스에 포함되어 있으므로 호출할 때는 클래스명.메서드() 식으로 호출된다.
모든 객체가 빈번히 호출하는 공ㅇ통적인 도우미 함수를 클래스 안에 포함시켜 두고자 할 때 정적 메서드를 사용한다.
'파이썬 > 클래스' 카테고리의 다른 글
[python] 파이썬 class의 __call__ 함수 (매직메소드) (0) | 2023.03.12 |
---|---|
[python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까? (0) | 2023.03.05 |
파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer) (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 2 (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 1 (0) | 2023.01.02 |