Python

파이썬 객체지향 프로그래밍과 매직 메서드 완벽 정리

코딩 코디네이터 2025. 4. 11. 17:00
반응형

파이썬 매직 메서드(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.nameself.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도 해보고, 덧셈도 해보고 하면서 연습해보세요.

그게 가장 빠른 학습법이랍니다! 😊

반응형