오늘은 파이썬에 있는 매직 메서드라는 것에 대해 알아보는 시간을 가져보자, 매직 메서드는 파이썬에서 더블 언더스코어 "__"로 시작하고 끝나는 특별한 이름의 메서드이다. 이러한 매직 메서드는 클래스 내에서 특정한 동작을 정의하거나 커스터마이징 하는 데 사용된다. 여러 가지 매직 메서드가 있지만 주요한 메서드의 간단한 설명과 예시 코드를 한 번 살펴보자.
1. __init__(self,...)
__init__() 메서드는 파이썬 클래스에서 특별한 메서드로, 객체가 생성될 때 자동으로 호출되는 생성자(constructor) 역할을 한다. __init__() 메서드를 정의하면 객체의 초기화 과정을 수행할 수 있으며, 이를 통해 객체의 속성(attribute)을 초기화하고 다른 초기 설정 작업을 수행할 수 있다.
__repr__() 메서드는 객체를 공식적으로 나타내는 문자열을 반환한다. 주로 디버깅 및 객체의 복원(재생성)에 사용되고 repr() 함수나 객체를 보여주는 상호작용 콘솔에서 호출된다.
3. __len__(self,...)
__len__() 메서드는 파이썬 클래스에서 사용자 정의 객체의 길이(크기)를 반환하는 메서드이다. 이 메서드를 정의하면 내장 함수 len()을 사용하여 객체의 길이를 확인할 수 있다. 따라서 객체의 길이를 나타내는 정수를 반환해야 한다. 그리고 len() 함수를 호출할 때, 파이썬은 이 메서드를 자동으로 호출하고 반환값을 반환한다. 일반적으로 이 메서드는 사용자 정의 컨테이너 클래스나 시퀀스 객체에서 사용된다.
__setitem__(self, key, value) 메서드는 객체의 요소를 설정(변경)할 때 호출된다. key 매개변수는 __getitem__() 예제에서 설명했던거와 마찬가지로 요소를 설정하기 위한 인덱스 또는 키를 나타내고 value 매개변수는 설정할 값이다.
__getitem__() 및 __setitem__() 메서드를 정의하면 사용자 정의 시퀀스 객체에서 요소를 가져오거나 설정할 때 내부 동작을 커스터마이즈할 수 있다. 이 메서드들을 사용하면 객체가 시퀀스처럼 동작하도록 만들 수 있으며, 사용자 정의 컨테이너 클래스에서 자체적으로 요소를 관리하거나 다른 동작을 수행할 수 있다.
5.__del__(self)
__del__() 메서드는 객체가 메모리에서 소멸될 때 호출되는 특별한 메서드이다. __del__() 메서드는 객체의 소멸(construction)과 관련된 동작을 정의할 때 사용된다. 이 메서드를 사용하여 객체가 소멸될 때 어떤 동작을 수행하고 메모리 자원을 해제할 수 있다.
또한, __del__() 메서드는 객체가 소멸될 때 자동으로 호출된다. 객체가 더 이상 참조되지 않거나 가비지 컬렉터에 의해 수거될 때 호출된다. 명시적으로 __del__() 메서드를 호출하는 것은 권장되지 않으며, 파이썬 인터프리터가 관리한다.
__del__() 메서드는 객체가 소멸할 때 출력문을 통해 언제 호출되는지 확인할 수 있다. 객체가 del 예약어를 사용하여 삭제되거나 더 이상 참조되지 않을 때 파이썬 인터프리터가 __del__() 메서드를 호출한다. 하지만 __del__() 메서드를 사용할 때 주의해야할 점이 있다. 객체가 소멸될 때 호출되므로 메모리 관리나 자원 해제와 관련된 작업을 수행하는 경우에만 사용해야 한다.
6. __call__(self,...)
__call__() 메서드는 파이썬 클래스의 특별한 메서드중 하나로, 객체를 함수처럼 호출할 수 있게 한다. 즉, 객체가 호출 가능하게 만들고 객체에 함수처럼 인자(argument)를 전달할 수 있게 한다. 이 메서드를 정의하면 해당 객체를 호출할 때 __call__() 메서드가 자동으로 호출된다.
CallableClass 클래스는 __call__()_ 메서드를 정의하여 객체가 호출 가능하게 만들었다. 객체 obj를 함수처럼 호출할 수 있으며, 호출할 때마다 인자로 전달된 값(x)을 객체의 value에 누적하여 반환한다.
__call__() 메서드를 사용하면 객체에 상태를 유지하거나 객체에 대한 다양한 동작을 정의하는 데 활용할 수 있으며, 함수와 유사한 동작을 가지게 된다.
7. __add__(self, other), __sub__(self, other)
__add__() 및 __sub__() 메서드는 파이썬에서 연산자 오버로딩(Operator Overloading)을 지원하는 메서드로, 사용자 정의 클래스에서 객체 간의 덧셈 및 뺄셈 연산을 정의할 때 사용된다. 이 메서드들을 정의하면 해당 클래스의 객체끼리 + 및 - 연산자를 사용하요 사용자 정의된 동작을 수행할 수 있다.
또한 위의 예제에서 확인할 수 있듯이 __sub__() 메서드는 - 연산자를 사용할 때 호출된다. 이 메서드는 뺄셈 연산을 정의하고, 두 객체를 뺀 결과를 반환한다.
8. __eq__(self, other), __ne__(self, other)
__eq__() 메서드와 __ne__() 메서드는 파이썬 클래스에서 객체 간의 동등성(equality) 비교를 정의하는 데 사용되는 특별한 메서드이다. 이러한 메서드를 정의하여 객체가 다른 객체와 동등한지(== 연산자) 또는 다르거나 부등한지(!= 연산자) 비교할 수 있다.
__ne__() 메서드는 != 연산자를 사용하여 두 객체가 부등한지 비교한다. __eq__()와는 반대로 두 객체가 부등한 경우 True를 반환하고, 그렇지 않은 경우 False를 반환한다.
__eq__() 및 __ne__() 메서드를 사용하면 사용자 정의 클래스에서 객체 간의 동등성 비교를 정의할 수 있다. 이를 통해 객체가 다른 객체와 비교되었을 때 필요한 조건에 따라 동작을 정의할 수 있으며, 객체의 내부 상태에 따라 비교 로직을 다양하게 조정할 수 있다.