Python

매직 메서드(Magic Method) : __init__, __del__


1. 용어 정리

용어

설명

Magic Method

특별한 의미를 가진 메서드, 이름이 __이름__ 형태

파이썬의 내장 동작(연산자, 함수, 형 변환 등)을 클래스에서 재정의할 수 있게 해줌

Dunder Method

"Double Underscore"의 줄임말로, __가 앞뒤로 붙은 메서드를 일컫는 별칭

예: __init__ → "던더 이닛(dunder init)"

2. 대표적인 매직메서드

메서드

설명

예시

__init__(self, ...)

생성자 (객체 생성 시 자동 호출)

p = Person("Alice")

__del__(self)

소멸자 (객체 삭제 시 자동 호출)

del p

__new__(cls, ...)

실제 객체 생성 (클래스 수준에서 실행)

고급 사용 시


파이썬 생성자 정리 (__init__ 중심)


파이썬 생성자 정리 (__init__ 중심)

1. 생성자란?

2. 기본 생성자 형태

class MyClass:
    def __init__(self, name):
        self.name = name

3. 사용 예시

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Alice", 25)
print(p.name)  # Alice
print(p.age)   # 25

4. 생성자 없이 객체 생성

class Animal:
    pass

a = Animal()

5. 디폴트 값 설정

class Student:
    def __init__(self, name="Unknown", grade=1):
        self.name = name
        self.grade = grade

6. 생성자 오버로딩?

class Book:
    def __init__(self, *args):
        if len(args) == 1:
            self.title = args[0]
        elif len(args) == 2:
            self.title = args[0]
            self.author = args[1]
        else:
            self.title = "Unknown"

7. __new__()와의 차이

항목

설명

__new__()

실제로 객체를 생성하는 메서드

__init__()

생성된 객체의 초기화를 담당하는 메서드

8. print로 확인

class Logger:
    def __init__(self):
        print("Logger 인스턴스가 생성되었습니다.")

l = Logger()  # 출력: Logger 인스턴스가 생성되었습니다.

파이썬 소멸자 정리 (__del__)


1. 소멸자란?

2. 기본 형태

class MyClass:
    def __del__(self):
        print("객체가 삭제됩니다.")

3. 사용 예시

class FileHandler:
    def __init__(self, filename):
        self.file = open(filename, 'w')
        print("파일 열림")

    def __del__(self):
        self.file.close()
        print("파일 닫힘")

f = FileHandler("test.txt")
del f  # 명시적으로 삭제

4. 동작 타이밍

5. 강제 소멸

del 객체명

6. 주의사항

주의점

설명

예외 처리 어려움

__del__

내부에서 예외가 발생해도 무시됨 (경고만 출력)

순환 참조

__del__

이 정의된 객체가 순환 참조되면 소멸되지 않을 수 있음

객체 존재 여부

소멸 시점에는 다른 속성이나 변수들이 이미 사라졌을 수 있음 →

AttributeError

주의

7. 좋은 사용 사례

8. 대안: with 문 사용

with open("file.txt", "w") as f:
    f.write("안녕하세요")
# 자동으로 파일 닫힘