클래스에서 메서드를 생성할 때 크게 3가지로 생성할 수 있다.
✅ 인스턴스 메서드
✅ @staticmethod (정적 메서드)
✅ @classmethod (클래스 메서드)
✔️ 먼저, 가장 기본인 인스턴스 메서드에 대해 알아보자
클래스 하위 메서드에 아무런 데코레이터 없이 선언한 메서드가 인스턴스 메서드이다. 첫 번째 매개변수로 클래스의 인스턴스가 넘어오게 되고, 그 이름을 self라고 한다. 즉 self는 클래스를 가리킨다고 생각하면 된다.
인스턴스 메서드는 이 self 를 통해 인스턴스 속성(attribute)에 접근하거나 다른 인스턴스 메서드를 호출할 수 있다.
뿐만 아니라 self 를 통해 클래스 속성에 접근하거나 클래스 메서드를 호출할 수도 있다.
class Company:
ceo = 'Ruby'
def __init__(self, name, address):
self.name = name
self.address = address
def print_ceo_name(self):
print(self.ceo)
def change_ceo_name(self):
self.ceo = self.name
print(self.ceo)
if __name__ == '__main__':
market = Company(name='Hwalim', address='Seoul')
market.print_ceo_name()
market.change_ceo_name()
>> Ruby
>> Hwalim
✔️ 클래스 메서드
@classmethod 데코레이터를 이용하여 클래스에 메서드를 선언하면 해당 메서드는 클래스 메서드가 된다. 인스턴스 메서드와 달리 첫 번째 매개변수로 클래스 인스턴스가 아닌 클래스 자체가 넘어오게 된다. 인스턴스를 가리키는 self 가 아닌 클래스를 의미하는 cls 로 적어준다. cls를 통해 클래스 속성에 접근하고 클래스 메서드를 호출할 수 있다. 그러나 인스턴스 속성에 접근하는 거나 인스턴스 메서드를 호출하는 건 불가능하다.
파이썬에서는 생성자 오버로딩을 지원하기 때문에, 클래스 메서드는 특히 팩토리 메서드를 작성할 때 유용하게 사용된다.
🧐 팩토리 메소드 패턴
- 생성 패턴 중 하나로 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하게 되는 것
- 추상 클래스와 관련이 있다.
class Company:
ceo = 'Ruby'
def __init__(self, name, address):
self.name = name
self.address = address
@classmethod
def print_ceo_name(cls):
print(cls.ceo)
@classmethod
def change_ceo_name(cls):
Company.ceo = 'Hwalim'
print(Company.ceo)
if __name__ == '__main__':
market = Company(name='Hwalim', address='Seoul')
market.print_ceo_name()
market.change_ceo_name()
>> Ruby
>> Hwalim
✔️ 마지막으로 정적(static) 메서드
정적 메서드는 유틸리티 클래스를 구현할 때 많이 사용된다고 한다.
비슷한 류의 여러 메서드를 하나의 클래스에 묶어두고 싶을 때 많이 사용한다. 굳이 인스턴스나 클래스의 속성 값을 초기화할 필요가 없을 경우에 사용하면 좋을 것 같다. 즉, 클래스 속성이나 인스턴스 접근이 필요할 때는 클래스 메서드, 접근이 굳이 필요 없을 때는 정적 메서드를 사용하면 된다.
또한, 따로 클래스의 인스턴스를 생성하지 않고 바로 클래스를 통해서 메서드를 호출할 수 있다는 장점이 있다.
그러나 파이썬에서 staticmethod를 굳이 왜 써야 하는 지에 대해 의문을 가지고 있는 사람도 있다. 사실 staticmethod는 모듈 대신 클래스 본체 안에 정의된 평범한 함수일 뿐이라고 생각한다.
🧐 유틸리티 클래스
- 인스턴스 메서드와 인스턴스 변수를 일절 제공하지 않고, 정적 메서드와 변수만을 제공하는 클래스를 뜻한다.
- 클래스 본래의 목적인 '데이터와 데이터 처리를 위한 로직의 캡슐화' 를 실행하는 것이 아닌, '비슷한 기능의 메서드와 상수를 모아서 캡슐화' 한 것이 유틸리티 클래스이다.
class Calculator:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def minus(a, b):
return a - b
if __name__ == '__main__':
print(Calculator.add(5, 3)) # 8
print(Calculator.minus(5, 3)) # 2
'Language > Python' 카테고리의 다른 글
[Python] Ray 를 활용한 병렬처리 | LIM (0) | 2023.01.21 |
---|---|
[Python] Module dependcy 새로운 관리 툴 Poetry | LIM (0) | 2022.12.17 |
[Python] 일급객체(First Class Object)란? | LIM (0) | 2022.12.11 |
[Python] Super() 기초 개념 및 활용 예제 | LIM (0) | 2022.11.08 |
[Python] MultiProcessing map() vs imap() | LIM (0) | 2022.09.19 |
댓글