Python
매직 메서드(Magic Method) : __init__, __del__
1. 용어 정리
용어 | 설명 |
---|---|
Magic Method | 특별한 의미를 가진 메서드, 이름이 파이썬의 내장 동작(연산자, 함수, 형 변환 등)을 클래스에서 재정의할 수 있게 해줌 |
Dunder Method | "Double Underscore"의 줄임말로, |
예: __init__
→ "던더 이닛(dunder init)"
2. 대표적인 매직메서드
메서드 | 설명 | 예시 |
---|---|---|
| 생성자 (객체 생성 시 자동 호출) |
|
| 소멸자 (객체 삭제 시 자동 호출) |
|
| 실제 객체 생성 (클래스 수준에서 실행) | 고급 사용 시 |
파이썬 생성자 정리 (__init__ 중심)
파이썬 생성자 정리 (__init__
중심)
1. 생성자란?
- 클래스의 인스턴스를 생성할 때 자동으로 호출되는 특별한 메서드입니다.
- 객체의 초기값 설정에 사용됩니다.
2. 기본 생성자 형태
class MyClass:
def __init__(self, name):
self.name = name
__init__()
는 파이썬에서 생성자 역할을 하는 메서드입니다.- 첫 번째 매개변수는 항상
self
여야 하며, 이는 현재 인스턴스 자신을 가리킵니다.
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
p = Person("Alice", 25)
를 호출하면__init__()
이 실행되어name
과age
를 초기화합니다.
4. 생성자 없이 객체 생성
class Animal:
pass
a = Animal()
__init__()
이 없어도 객체는 생성됨- 자동으로 빈 생성자가 사용됨
5. 디폴트 값 설정
class Student:
def __init__(self, name="Unknown", grade=1):
self.name = name
self.grade = grade
- 생성자에 기본 값을 지정하여 인자가 없어도 사용할 수 있게 함
6. 생성자 오버로딩?
- 파이썬은 생성자 오버로딩을 지원하지 않음
- 대신 기본값이나
*args
,**kwargs
로 구현
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__()
와의 차이
항목 | 설명 |
---|---|
| 실제로 객체를 생성하는 메서드 |
| 생성된 객체의 초기화를 담당하는 메서드 |
8. print로 확인
class Logger:
def __init__(self):
print("Logger 인스턴스가 생성되었습니다.")
l = Logger() # 출력: Logger 인스턴스가 생성되었습니다.
파이썬 소멸자 정리 (__del__)
1. 소멸자란?
- 객체가 삭제되거나 참조 카운트가 0이 되어 메모리에서 해제될 때 자동으로 호출되는 메서드
- 자원 정리(파일 닫기, 네트워크 연결 종료 등)에 사용
2. 기본 형태
class MyClass:
def __del__(self):
print("객체가 삭제됩니다.")
- 메서드 이름은 반드시
__del__
이어야 함 self
는 현재 인스턴스를 가리킴
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. 동작 타이밍
- 객체가 소멸할 때 호출되지만, 정확한 시점은 보장되지 않음
- 주로 참조 카운트가 0일 때 실행되지만,
gc
(garbage collector)가 동작하는 방식에 따라 지연될 수 있음- 특히 **순환 참조(circular reference)**가 있을 경우 실행되지 않을 수 있음
5. 강제 소멸
del 객체명
- 객체를 명시적으로 삭제 가능
- 단, 다른 곳에서 여전히 참조하고 있으면
__del__
은 호출되지 않음
6. 주의사항
주의점 | 설명 |
---|---|
예외 처리 어려움 |
내부에서 예외가 발생해도 무시됨 (경고만 출력) |
순환 참조 |
이 정의된 객체가 순환 참조되면 소멸되지 않을 수 있음 |
객체 존재 여부 | 소멸 시점에는 다른 속성이나 변수들이 이미 사라졌을 수 있음 →
주의 |
7. 좋은 사용 사례
- 파일, 소켓, DB 연결 등 시스템 자원 해제 시 유용
- 그러나 일반적으로는
with
문 같은 컨텍스트 매니저(__enter__
,__exit__
)를 권장함
8. 대안: with
문 사용
with open("file.txt", "w") as f:
f.write("안녕하세요")
# 자동으로 파일 닫힘