파이썬에서 메서드(Method)와 함수(Function)는 중요한 개념으로, 둘 다 코드의 재사용성과 구조화를 돕는다. 하지만 이 둘은 사용하는 맥락과 동작 방식에서 차이가 있다.
메서드 (Method)
메서드는 클래스 내부에 정의된 함수로, 클래스의 인스턴스나 클래스 자체와 연관된 동작을 정의한다. 메서드는 클래스의 인스턴스에 바인딩되며, 첫 번째 매개변수로 항상 self
(또는 클래스 메서드의 경우 cls
)를 받는다.
인스턴스 메서드 (Instance Method)
클래스의 인스턴스와 관련된 동작을 정의한다.
첫 번째 매개변수로
self
를 받는다.인스턴스 변수와 메서드에 접근할 수 있다.
class Person:
def __init__(self, name):
self.name = name
def greet(self):
return f"안녕하세요, {self.name}님!"
# 인스턴스 메서드 호출
person = Person("홍길동")
print(person.greet()) # 안녕하세요, 홍길동님! 출력
클래스 메서드 (Class Method)
클래스 자체와 관련된 동작을 정의한다.
첫 번째 매개변수로
cls
를 받는다.클래스 변수와 클래스 메서드에 접근할 수 있다.
@classmethod
데코레이터를 사용하여 정의한다.
class Person:
population = 0
def __init__(self, name):
self.name = name
Person.population += 1
@classmethod
def get_population(cls):
return f"총 인구수는 {cls.population}명입니다."
# 클래스 메서드 호출
print(Person.get_population()) # 총 인구수는 0명입니다. 출력
정적 메서드 (Static Method)
클래스나 인스턴스와 독립적으로 동작한다.
첫 번째 매개변수로
self
나cls
를 받지 않는다.@staticmethod
데코레이터를 사용하여 정의한다.
class Math:
@staticmethod
def add(a, b):
return a + b
# 정적 메서드 호출
print(Math.add(3, 5)) # 8 출력
함수 (Function)
클래스 내부에 정의된 일반 함수는 특정 인스턴스나 클래스와 직접 연관되지 않으며, 독립적인 작업을 수행하기 위해 정의될 수 있다. 그러나 일반적으로 클래스 내부에는 메서드만 정의하고, 함수는 클래스 외부에 정의한다.
클래스 내부에 정의된 함수는 클래스나 인스턴스의 맥락에서 동작하지 않기 때문에 일반적으로 클래스 외부에 두는 것이 좋다.
class Example:
def instance_method(self):
return "인스턴스 메서드 호출됨"
@classmethod
def class_method(cls):
return "클래스 메서드 호출됨"
@staticmethod
def static_method():
return "정적 메서드 호출됨"
def regular_function():
return "이것은 함수이며, 클래스나 인스턴스와 연관되지 않음"
# 객체 생성
example = Example()
# 인스턴스 메서드 호출
print(example.instance_method()) # 인스턴스 메서드 호출됨 출력
# 클래스 메서드 호출
print(Example.class_method()) # 클래스 메서드 호출됨 출력
# 정적 메서드 호출
print(Example.static_method()) # 정적 메서드 호출됨 출력
# 클래스 내부에 정의된 함수는 호출 불가
try:
print(example.regular_function())
except TypeError as e:
print(e) # TypeError: regular_function() takes 0 positional arguments but 1 was given 출력
위 예제에서 regular_function
은 클래스 내부에 정의되었지만 인스턴스나 클래스와 연결되지 않기 때문에 호출 시 에러가 발생한다. 이 함수는 클래스 내부에서 잘못된 위치에 정의된 것으로 볼 수 있으며, 클래스 외부에 정의하는 것이 더 적절하다.
정리
메서드(Method): 클래스 내부에 정의되며, 인스턴스 또는 클래스와 관련된 동작을 정의한다. 인스턴스 메서드, 클래스 메서드, 정적 메서드로 구분된다.
함수(Function): 일반적으로 클래스 외부에 정의되며, 특정 작업을 수행하기 위한 독립적인 코드 블록이다. 클래스 내부에서 정의된 일반 함수는 메서드와 달리 클래스나 인스턴스와 관련이 없다.