파이썬 객체지향 프로그래밍과 매직 메서드 완벽 정리
파이썬 매직 메서드(Magic Method) 완전 정복 🧙♂️
여러분,
__init__, __str__, __add__ 같은 이상한 이름의 메서드들,
한 번쯤 보셨죠?
이거 그냥 넘어가면 진짜 손해예요!
안녕하세요!
이번 글에서는 파이썬 객체지향 프로그래밍에서 빼놓을 수 없는 매직 메서드에 대해 알아보려고 해요.
이름부터 범상치 않죠?
마법 같아 보이는 이 메서드들은 사실 객체의 동작을 정의해주는 파이썬의 핵심 기능이에요.
예를 들어
우리가 print(객체)
를 했을 때 예쁘게 출력되거나, 객체1 + 객체2
가 가능해지는 것도 모두 매직 메서드 덕분이랍니다.
이 글에서는 기초부터 실전 활용까지 하나하나 친절하게 알려드릴게요.
특히 개발 초보자분들이 이해하기 쉽도록 예제 위주로 설명드리니, 걱정하지 마시고 끝까지 함께 해요!
목차
1. __init__ 생성자의 진짜 역할 🛠
__init__ 메서드는 클래스의 객체가 만들어질 때 자동으로 호출되는 생성자 메서드예요.
객체를 초기화할 때 사용되며, 인스턴스를 만들자마자 실행되죠.
마치 입학식에서 이름표를 붙여주는 느낌이랄까요?
기본 구조와 사용법
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("철수", 30)
print(p1.name) # 철수
print(p1.age) # 30
객체 p1
을 만들자마자 __init__
이 실행돼서 self.name
과 self.age
에 값을 할당한 거예요.
이게 없으면 객체가 '텅 빈 상태'로 만들어지겠죠!
왜 꼭 필요할까요?
- 객체 생성과 동시에 필요한 데이터를 초기화할 수 있어요.
- 오류 방지에도 효과적이에요. 값이 없는 상태에서 메서드를 호출하면
AttributeError
가 발생할 수 있거든요. - 프로그램의 구조와 흐름을 명확하게 만들 수 있어요.
Tip! 꼭 기억하세요
__init__
의 첫 번째 매개변수는 반드시 self
여야 해요.
이건 객체 자신을 가리키는 약속된 이름이거든요.
다른 이름으로 바꿔도 되긴 하지만... 안 쓰는 게 좋아요.
혼란만 생기니까요 😅
정리해볼까요?
항목 | 내용 |
---|---|
정의 | 객체 생성 시 자동 호출되는 초기화 메서드 |
문법 | def __init__(self, ...): |
역할 | 객체에 필요한 데이터를 초기 세팅 |
주의사항 | self 는 꼭 첫 번째 인자로 지정 |
2. __str__로 객체를 예쁘게 출력하기 💬
__str__
메서드는 객체를 문자열로 표현할 때 호출되는 매직 메서드예요.
우리가 print(객체)
를 했을 때 보이는 결과, 그게 바로 __str__
덕분이죠.
이 메서드를 정의하지 않으면 기본값으로 <__main__.클래스명 object at 0x~~~>
처럼 딱딱하고 보기 힘든 문자열이 출력돼요.
예제로 이해하는 __str__
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __str__(self):
return f"『{self.title}』 by {self.author}"
book1 = Book("파이썬 마스터", "홍길동")
print(book1)
위 코드에서 __str__
메서드는 책 정보를 예쁘게 문자열로 포장해서 보여주고 있어요.
print(book1)
을 하면 “『파이썬 마스터』 by 홍길동”이 출력되죠.
완전 깔끔하죠? 😎
__repr__과의 차이점은?
- __str__은 사용자 친화적인 설명용, 즉 ‘보기 좋게’ 출력되는 문자열
- __repr__은 디버깅이나 로그용, ‘개발자용’ 정보 중심 출력
예를 들어 리스트를 출력할 때 내부 객체에 __str__
이 없으면 __repr__
이 호출돼요.
실제 개발에서는 __str__
과 __repr__
을 모두 정의해두는 게 좋아요.
보너스 팁 💡
__str__
안에서는 꼭 문자열을 반환해야 해요!
print()
를 해도 None
이 뜬다면 return이 빠졌는지 확인해보세요.
정리 요약 📌
항목 | 내용 |
---|---|
정의 | print(객체) 또는 str(객체) 호출 시 실행되는 메서드 |
역할 | 객체의 정보를 보기 좋게 문자열로 반환 |
반드시 반환? | 문자열을 return해야 정상 작동 |
__repr__과 차이 | __repr__은 개발자용, __str__은 사용자용 |
3. __add__로 객체끼리 덧셈 구현하기 ➕
__add__
메서드는 우리가 흔히 쓰는 + 연산자를 객체끼리 사용할 수 있게 해주는 매직 메서드예요.
예를 들어,
두 개의 숫자형 객체 또는 좌표 객체를 + 연산
으로 결합하고 싶다면 이 메서드를 활용하면 됩니다!
기본 사용 예제
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
def __str__(self):
return f"({self.x}, {self.y})"
p1 = Point(2, 3)
p2 = Point(4, 1)
print(p1 + p2) # (6, 4)
p1 + p2
는 사실 p1.__add__(p2)
로 호출돼요.
즉, __add__
는 + 기호의 비밀 통로 같은 존재죠. 덕분에 코드가 훨씬 읽기 쉬워집니다.
주의할 점
- other는 반드시 같은 클래스의 인스턴스라는 보장이 없어요. 타입 체크 필수!
- 반환 값은 가급적 새로운 인스턴스로 만들어야 해요. 원본을 수정하는 건 좋지 않아요.
타입 확인 예제
def __add__(self, other):
if not isinstance(other, Point):
return NotImplemented
return Point(self.x + other.x, self.y + other.y)
NotImplemented
를 반환하면 파이썬이 다른 방법으로 연산을 시도하게 돼요.
(예: other.__radd__()
호출)
정리 요약 🔁
항목 | 내용 |
---|---|
정의 | 객체 간 + 연산 정의 |
문법 | def __add__(self, other): |
반환 값 | 일반적으로 새로운 객체 |
활용 예 | 좌표, 벡터, 통계값 등 덧셈이 자연스러운 객체 |
4. __eq__로 객체 비교 가능하게 만들기 🔍
__eq__
는 객체끼리 == 연산을 할 수 있도록 만들어주는 매직 메서드예요.
기본적으로 객체는 동일한 인스턴스일 때만 같다고 판단하지만, __eq__
를 재정의하면 속성 값 기준으로 비교할 수 있어요.
예를 들어, 두 책 객체의 제목과 저자가 같다면 동일한 책으로 판단할 수 있게 되는 거죠!
기본 사용 예제
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __eq__(self, other):
return self.title == other.title and self.author == other.author
book1 = Book("파이썬 기초", "홍길동")
book2 = Book("파이썬 기초", "홍길동")
book3 = Book("파이썬 고급", "홍길동")
print(book1 == book2) # True
print(book1 == book3) # False
보셨죠? __eq__
덕분에 ==
연산이 단순히 메모리 주소 비교가 아니라 내용 기반 비교로 바뀌었어요.
정말 강력한 기능이에요!
주의할 점 💡
- 타입 검사는 필수입니다! 다른 클래스와 비교할 경우 오류가 날 수 있어요.
-
__eq__
만 정의하면!=
연산자는 자동 지원되지 않아요.__ne__
도 같이 정의하면 좋아요.
타입 검사 버전 예시
def __eq__(self, other):
if not isinstance(other, Book):
return NotImplemented
return self.title == other.title and self.author == other.author
정리 요약 📑
항목 | 내용 |
---|---|
정의 | == 연산자를 커스터마이징할 수 있는 매직 메서드 |
활용 | 속성 기반 비교, 테스트 자동화 시 유용 |
보완 | __ne__ 같이 정의 권장 |
타입 검사 | isinstance 또는 type() 으로 비교 |
5. 자주 쓰는 매직 메서드 리스트 🧾
지금까지 배운 __init__
, __str__
, __add__
, __eq__
외에도 파이썬에는 다양한 매직 메서드(Magic Method)들이 있어요.
이 메서드들을 활용하면 클래스를 파이썬스럽게 쓰는 멋진 코드를 만들 수 있습니다.
여기서는 자주 쓰이는 매직 메서드들을 분야별로 정리해봤어요!
💡 생성 및 초기화 관련
메서드 | 설명 |
---|---|
__new__(cls) |
객체 생성 시 가장 먼저 호출됨 (보통 잘 안 씀) |
__init__(self) |
객체 생성 후 초기화 |
🖨 출력 및 표현 관련
메서드 | 설명 |
---|---|
__str__ |
print() 시 출력 형태 지정 |
__repr__ |
개발자용 디버깅 출력 문자열 |
➕ 연산자 오버로딩 관련
메서드 | 역할 |
---|---|
__add__ |
+ |
__sub__ |
- |
__mul__ |
* |
__truediv__ |
/ (나누기) |
__mod__ |
% (나머지) |
✅ 비교 관련 메서드
메서드 | 역할 |
---|---|
__eq__ |
== (같다) |
__ne__ |
!= (다르다) |
__lt__ |
< (작다) |
__le__ |
<= (작거나 같다) |
__gt__ |
> (크다) |
__ge__ |
>= (크거나 같다) |
이 외에도 __len__
, __getitem__
, __call__
등 정말 많은 매직 메서드들이 있어요.
하지만 걱정 마세요. 상황에 맞게 하나씩만 잘 써도 충분히 파이썬 고수가 될 수 있어요! 😉
마무리 🎯
파이썬의 매직 메서드, 처음 보면 좀 낯설고 복잡해 보일 수 있어요.
이름도 특이하고 동작 방식도 조금은 추상적이죠.
그런데 한 번만 제대로 이해하고 나면, 객체지향 프로그래밍이 훨씬 자연스럽고 재밌어져요.
오늘 배운 __init__, __str__, __add__, __eq__부터 시작해서 다양한 연산자 오버로딩 메서드들까지, 실제 실무에서 자주 등장하는 개념들이니 꼭 익혀두시면 좋아요.
혹시 지금도 이해가 100% 안 된다면 괜찮아요.
직접 클래스를 만들어보고 print도 해보고, 덧셈도 해보고 하면서 연습해보세요.
그게 가장 빠른 학습법이랍니다! 😊