Profile picture

[Python] 클래스(Class)가 가지고 있는 특별한 메소드 살펴보기

JaehyoJJAng2022년 09월 05일

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 문과 컨텍스트 관리자를 사용하는 것이 더욱 권장된다.


Loading script...