Special Method
파이썬이 익숙하다면 str
, any
등의 수 많은 내장 함수를 많이 사용해봤을 것이다.
그러나 사실 str
은 함수가 아니며, 기본 내장 클래스이다.
예를 들어, str(10)
을 실행하는 것은 str
클래스의 생성자 메소드의 인자로 10을 주는 것과 동일하다.
실제로 인터프리터에서 help(str)
로 결과를 보면 다음과 같다.
>>> help(str)
Help on class str in module builtins:
class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
....
이처럼 많은 내장 함수들이 클래스로 구현되어 있고, 클래스에 구현되어 있는 메소드들을 통해 작동한다.
클래스안에는 __str__
과 같이 특별한 역할을 하는 메소드들이 존재하는데, 이를 Special Method 또는 Magic Method 라고도 한다.
이번 실습에서는 수 많은 magic methmod 들중에 __init__
, __repr__
, __del__
에 대해서 이해해 볼 거다.
init
__init__
메소드는 파이썬에서 클래스 생성자 메소드로, 객체가 생성될 때 자동으로 호출된다.
주로 객체의 초기화 작업을 수행하는 데 사용되며, 클래스의 속성을 설정하거나 초기 값을 할당하는 데 활용된다.
__init__
메소드는 다음과 같은 특징이 존재한다.
- 자동 호출 : 객체가 생성될 때 자동으로 호출됨.
- 매개변수 전달 : 인스턴스 생성 시 전달된 인수를 받아 처리할 수 있다.
- self 사용 : 첫 번째 매개변수는 항상
self
이어야 하고, 이는 생성된 인스턴스를 가리킨다.
다음은 __init__
메소드를 사용하는 예제이다.
class Person():
def __init__(self, name: str, age: int ) -> None:
self.name = name # 인스턴스 변수 name이 매개변수로 들어온 name으로 초기화 됨.
self.age = age # 인스턴스 변수 age이 매개변수로 들어온 age으로 초기화 됨.
print(f"{self.name} 객체가 생성됨!")
# 객체 생성
person1 = Person(name="JJ", age=15)
# 생성된 객체의 인스턴스 변수 name과 age를 각각 출력
print(person1.name)
print(persion1.age)
repr
__repr__
메소드는 Class로부터 인스턴스가 선언될 때, 혹은 인스턴스가 호출될 때, 그리고 인스턴스를 print
할 때 실행되는 메소드이다.
아래와 같이 샘플 코드를 만들어보자.
인스턴스가 생성될 때 __repr__
메소드는 객체에 선언된 name
를 반환하게 될 것이다.
class Fruit():
def __init__(self, name: str) -> None:
self.name = name
# 인스턴스를 호출하거나 print하면 동작
def __repr__(self) -> str:
return f"I am {self.name}."
아래는 __repr__
의 예시이다.
banana = Fruit(name='banana')
print(banana)
>>> I'am banana
del
__del__
메소드는 인스턴스를 삭제하고 값을 return 해준다.
해당 메소드는 객체가 가비지 컬렉션에 의해 메모리에서 제거될 때 호출된다.
다음은 __del__
메소드를 사용하는 예제이다.
class MyClass():
def __init__(self, name:str) -> None:
self.name = name
print(f"객체 {self.name}가 생성되었다.")
def __del__(self) -> None:
print(f"객체 {self.name}가 소멸되었다.)
# 객체 생성
obj = MyClass(name="JJ")
# 객체 삭제
del obj
이 코드를 실행하면 객체가 생성되고, del obj
로 삭제될 때 __del__()
메소드가 호출된다.
그러나 __del__()
메소드의 호출 시점은 가비지 컬렉터에 의해 결정되므로 예측하기 어려울 수 있다.
__del__()
메소드는 일반적으로 리소스 해제와 같은 특정 작업이 필요할 때 사용되지만, 리소스를 명시적으로 관리하는 것이 더 안전하고 좋다
(예: 파일을 열었으면 닫기, 데이터베이스 연결을 닫기 등). Python에서는 with
문과 컨텍스트 관리자를 사용하는 것이 더욱 권장된다.