이전 시간에 데코레이터에 대한 개념과 Class 기초, Class 심화에 대해 배웠습니다. 유용한 내용이 많기 때문에 잘 모르신다면 한 번은 읽고 오시는 것을 추천드립니다.
파이썬 메서드의 개념과 종류
Class 안에 사용되는 함수를 메서드라고 합니다. 메서드에는 3가지 종류가 있습니다.
1. 인스턴스 메서드(Instance Method): 흔히 Class 안의 함수라고 할 때, 가장 일반적인 경우가 인스턴스 메서드입니다. 자기 자신(인스턴스)을 인자로 전달하기 때문에 인스턴스 내부의 속성과 메서드에 접근할 수 있습니다.
2. 정적 메서드(Static Method): 자기 자신(클래스 또는 인스턴스)을 전달하지 않고, 전달받은 인자로만 행동을 취하는 순수한 Pure 함수입니다. 클래스 밖의 함수와 큰 차이가 없습니다. 그럼에도 굳이 Class 안에 정의하는 이유는 두 가지입니다. 첫째, Class 안에 비슷한 류의 기능을 처리하는 함수를 모아두고 싶은 경우입니다. 둘째, Class의 실행을 도와주는 유용한 유틸 기능(utils)을 구현한 경우입니다. 요약하면, '개념적으로' 비슷하다면 순수한 함수여도 Class 안에 정적 메서드로 선언합니다.
3. 클래스 메서드(Class Method): 자기 자신(클래스)을 인자로 전달합니다. 클래스 내부의 속성과 메서드에 접근할 수 있습니다. 인스턴스를 선언하지 않고 호출할 수 있습니다.
인스턴스 메서드(Instance Method) vs 클래스 메서드(Class Method)
인스턴스, 클래스, 정적 메서드를 모두 선언해 둔 human Class로 실습을 진행해 보겠습니다. 참고로 클래스, 정적 메서드는 함수 이름 위에 각각 @classmethod와 @staticmethod, 두 개의 데코레이터를 선언함으로써 정의할 수 있습니다.
class human:
"""최상위 Class"""
species = '영장류'
features = ['이족 보행','지적 능력']
scientific_name = '호모 사피엔스'
def instance_method_show(self):
print(f"human은 {self.species}이고,{self.features} 특징이 있으며 학명은 {self.scientific_name}이다.")
@classmethod
def class_method_show(self):
print(f"human은 {self.species}이고,{self.features} 특징이 있으며 학명은 {self.scientific_name}이다.")
@staticmethod
def static_method_show():
print("저는 객체의 속성에는 접근할 수 없습니다.")
인스턴스 메서드와 클래스 메서드의 차이는 전달하는 인자가 인스턴스인지, 클래스인지 차이입니다. 따라서 두 메서드 모두 인스턴스나 클래스의 속성에 접근할 수 있습니다. 두 메서드의 차이점은 선언 방식입니다.
인스턴스 메서드는 아래처럼 Class로부터 인스턴스를 선언한 다음에 호출할 수 있습니다. 자기 자신, 인스턴스를 self 인자에 전달하기 때문입니다. (인스턴스로 접근)
me = human()
me.instance_method_show()
# 또는 아래와 같이 선언.
human().instance_method_show()
# 위 코드의 결과값
human은 영장류이고,['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.
반면, 클래스 메서드는 클래스를 인자로 전달하기 때문에 굳이 인스턴스를 선언할 필요가 없습니다. (클래스로 접근)
# human()이라는 인스턴스가 아니라, human이라는 클래스로 접근
human.class_method_show()
# 위 코드의 결과값
human은 영장류이고,['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.
인스턴스 메서드(Instance method) vs 정적 메서드(Static method)
정적 메서드는 Pure 한 함수와 차이가 없다고 말씀드렸습니다. 인스턴스나 클래스 메서드는 자기 자신(인스턴스 또는 클래스)을 인자로 전달하지만 정적 메서드는 자기 자신을 인자로 전달하지 않습니다.
따라서, 정적 메서드는 클래스나 인스턴스 메서드처럼 속성에 접근할 수 없습니다. 아래 정적 메서드를 다시 보시면, 인자에 'self'가 없는 것을 볼 수 있습니다.
# 정적 메서드는 self 인자가 필요 없다.
@staticmethod
def static_method_show():
print("저는 객체의 속성에는 접근할 수 없습니다.")
정적 메서드는 호출할 때, 인스턴스를 선언해도 되고 선언하지 않고 클래스로 접근해도 됩니다.
# 인스턴스로 접근
human().static_method_show()
# 클래스로 접근
human.static_method_show()
# 이 코드의 결과값
저는 객체의 속성에는 접근할 수 없습니다.
'Python > 기초' 카테고리의 다른 글
[파이썬/Python] 예외 처리 개념과 실습(feat. 대표 오류 메세지) (0) | 2023.07.13 |
---|---|
[파이썬/Python] Class에 특별한 메서드 (0) | 2023.07.12 |
[파이썬/Python] 이해하기 쉬운 데코레이터 원리 (0) | 2023.07.11 |
[파이썬/Python] Class 심화: 상속에 대한 모든 것 (0) | 2023.07.11 |
[파이썬/Python] Class의 정의와 사용법(feat. 함수와의 차이) (0) | 2023.07.11 |
댓글