본문 바로가기
프로그래밍/python

[파이썬] 파이썬의 __init__ 이해하기: 생성자 메서드

by 코끼리_땃쥐 2024. 12. 30.

파이썬에서 객체 지향 프로그래밍(OOP)을 배울 때 가장 먼저 만나는 개념 중 하나가 __init__ 메서드입니다. 이 특별한 메서드는 생성자(Constructor)라고 불리며, 객체의 초기화를 담당합니다. 이 글에서는 __init__ 메서드의 역할, 사용법, 그리고 흔히 하는 실수에 대해 알아보겠습니다.

 

__init__이란 무엇인가요?

__init__  메서드는 클래스의 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 객체의 초기 상태를 설정하거나 필요한 데이터를 전달받아 속성을 정의하는 데 사용됩니다.

 

__init__ 메서드의 기본 구조

class 클래스명:
    def __init__(self, 매개변수):
        # 초기화 코드
        self.속성 = 값
  • self: 생성된 객체 자신을 참조합니다. 반드시 첫 번째 매개변수로 전달되어야 합니다.
  • 매개변수: 객체를 초기화할 때 전달받는 값들입니다.

예제: 기본적인 __init__ 사용법

class Dog:
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed

    def introduce(self):
        return f"저는 {self.name}이고, {self.breed}입니다."

# 객체 생성
dog1 = Dog("바디", "골든 리트리버")
dog2 = Dog("찰리", "푸들")

print(dog1.introduce())  # 출력: 저는 바디이고, 골든 리트리버입니다.
print(dog2.introduce())  # 출력: 저는 찰리이고, 푸들입니다.

위 코드에서 Dog 클래스의 __init__ 메서드는 namebreed 속성을 초기화합니다. 객체를 생성할 때 전달한 값에 따라 각 객체의 상태가 설정됩니다.

 

__init__에서 기본값 사용하기

__init__ 메서드에서 매개변수에 기본값을 지정하면, 객체 생성 시 해당 매개변수를 생략할 수 있습니다.

class Car:
    def __init__(self, make, model, year=2020):
        self.make = make
        self.model = model
        self.year = year

car1 = Car("현대", "소나타")
car2 = Car("기아", "K5", 2023)

print(car1.year)  # 출력: 2020
print(car2.year)  # 출력: 2023

기본값을 사용하면 코드가 더욱 간결해지고 유연성이 높아집니다.

__init__ 메서드의 역할

  1. 객체 초기화: 객체 생성 후 초기 상태를 설정합니다.
  2. 데이터 전달: 객체에 필요한 데이터를 생성 시 전달받습니다.
  3. 일관성 유지: 모든 객체가 동일한 초기화 과정을 거칩니다.

 

흔히 하는 실수와 주의점

1. self 누락

self를 사용하지 않으면 속성이 객체에 저장되지 않고 지역 변수로 처리됩니다.

class Example:
    def __init__(self, value):
        value = value  # 잘못된 코드

obj = Example(10)
print(obj.value)  # AttributeError 발생

 

올바른 코드:

class Example:
    def __init__(self, value):
        self.value = value

obj = Example(10)
print(obj.value)  # 출력: 10

 

2. 생성자 역할에 대한 오해

__init__은 객체를 생성하는 메서드가 아니라 초기화하는 메서드입니다. 객체의 생성은 __new__ 메서드가 담당합니다.

상속에서 __init__ 사용하기

상속 관계에서 부모 클래스의 __init__ 메서드를 호출하려면 super()를 사용할 수 있습니다.

class Animal:
    def __init__(self, species):
        self.species = species

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__("Dog")
        self.name = name
        self.breed = breed

buddy = Dog("버디", "래브라도")
print(buddy.species)  # 출력: Dog

super()를 사용하면 부모 클래스의 초기화 로직을 재사용할 수 있어 코드의 중복을 줄일 수 있습니다.

 

고급 사용법

1. 초기화 로직 분리

__init__ 내부에서 별도의 메서드를 호출하여 초기화 로직을 분리할 수 있습니다.

class Person:
    def __init__(self, first_name, last_name):
        self.full_name = self._create_full_name(first_name, last_name)

    def _create_full_name(self, first, last):
        return f"{first} {last}"

person = Person("홍", "길동")
print(person.full_name)  # 출력: 홍 길동

 

댓글