본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 객체 지향의 시작, __init__ 메서드의 본질과 설계 철학 완벽 분석

by Papa Martino V 2026. 2. 17.
728x90
__init__ 메서드
__init__ 메서드

 

파이썬(Python)에서 클래스(Class)를 배우기 시작할 때 가장 먼저 마주하게 되는 산이 바로 __init__ 메서드입니다. 단순히 "객체를 만들 때 실행되는 함수"라고만 알고 넘어가기에는, 이 메서드가 파이썬의 객체 지향 프로그래밍(OOP) 아키텍처에서 차지하는 비중이 매우 큽니다. 클래스가 붕어빵 틀이라면, __init__은 팥을 넣을지 슈크림을 넣을지 결정하여 붕어빵의 '초기 상태'를 결정하는 중요한 공정입니다. 본 가이드에서는 __init__의 필요성, 작동 원리, 그리고 이를 활용한 전문적인 객체 설계 기법을 심층적으로 다룹니다.


1. __init__ 메서드란 무엇인가?

파이썬에서 __(Double Underscore)로 시작하고 끝나는 메서드를 매직 메서드(Magic Method) 또는 던더(Dunder) 메서드라고 부릅니다. 그 중 __init__은 클래스의 인스턴스가 생성될 때 자동으로 호출되는 초기화 전용 메서드입니다. 엄밀히 말하면 __init__은 객체를 생성(Create)하는 메서드가 아니라, 생성된 직후의 객체에 필요한 데이터를 채워넣는(Initialize) 역할을 합니다. 객체 생성 자체는 __new__ 메서드가 담당하지만, 일반적인 개발 수준에서는 __init__을 생성자(Constructor)처럼 간주하고 사용합니다.


2. 왜 __init__이 반드시 필요한가?

객체가 생성되자마자 유효한 상태를 갖게 하기 위해서입니다. 만약 __init__이 없다면, 우리는 객체를 생성한 후 매번 수동으로 속성(Attribute)을 정의해줘야 합니다. 이는 코드 중복을 초래하고 실수의 가능성을 높입니다.

구분 __init__ 사용 안 함 __init__ 사용함
자동화 속성 설정을 위해 별도 함수 매번 호출 인스턴스 생성 시 동시에 속성 설정
무결성 속성 누락 시 AttributeError 위험 필수 데이터 없이는 객체 생성 불가 (안전)
가독성 코드가 길어지고 구조가 파편화됨 객체의 초기 형태를 한눈에 파악 가능
유지보수 속성 변경 시 호출부를 모두 수정 클래스 내부 정의만 수정하면 됨

3. 실전 Sample Example: 사용자 프로필 관리

객체가 생성됨과 동시에 특정 데이터를 강제하고, 해당 데이터를 기반으로 상태를 정의하는 예제입니다.

class Smartphone:
    def __init__(self, brand, model, battery=100):
        # self는 생성된 객체 자신을 가리킵니다.
        self.brand = brand
        self.model = model
        self.battery = battery
        self.is_on = False
        print(f"{self.model} 인스턴스가 생성되었습니다.")

    def power_on(self):
        self.is_on = True
        print(f"{self.brand} {self.model} 전원이 켜졌습니다.")

# 객체 생성과 동시에 초기값 전달
my_phone = Smartphone("Apple", "iPhone 15")
your_phone = Smartphone("Samsung", "Galaxy S24", 95)

# 초기화된 데이터 사용
print(my_phone.brand) # Apple
my_phone.power_on()

4. self의 정체와 __init__의 매개변수 설계

__init__(self, ...)에서 첫 번째 인자인 self는 약속입니다. 파이썬은 인스턴스를 만들 때 자동으로 해당 인스턴스의 주소값을 self로 전달합니다. 이를 통해 클래스 내부에서 "내 이름(self.name)", "내 나이(self.age)"와 같이 개별 객체의 고유 데이터를 관리할 수 있게 됩니다.

전문적인 초기화 패턴

  • 기본값 설정: battery=100과 같이 필수적이지 않은 인자는 기본값을 설정하여 유연성을 높입니다.
  • 유효성 검사: __init__ 내부에서 전달된 값이 올바른지 검사하여 잘못된 객체 생성을 원천 차단할 수 있습니다.
def __init__(self, age):
    if age < 0:
        raise ValueError("나이는 음수일 수 없습니다.")
    self.age = age

5. 상속 관계에서의 __init__ (super())

다른 클래스를 상속받을 때, 자식 클래스에서 __init__을 새로 정의하면 부모 클래스의 __init__은 무시됩니다. 이때 부모의 초기화 로직을 그대로 이어받으려면 super().__init__()을 명시적으로 호출해야 합니다. 이는 대규모 프로젝트에서 아키텍처의 일관성을 유지하는 핵심 기술입니다.


6. 결론: 좋은 설계는 __init__에서 시작된다

__init__ 메서드는 단순한 문법적 장치가 아니라, 객체의 생명 주기와 책임 범위를 정의하는 설계도입니다. 어떤 속성을 __init__에 넣고 어떤 것을 메서드로 처리할지 결정하는 과정이 곧 소프트웨어 설계의 핵심입니다. 명확하고 견고한 __init__ 설계는 코드의 재사용성을 높이고 버그를 줄이는 가장 빠른 길입니다.


내용 출처

  • Python Language Reference: Data Model - object.__init__
  • "Fluent Python" by Luciano Ramalho: Object-Oriented Idioms
  • Real Python: "Object-Oriented Programming (OOP) in Python 3"
  • Python.org: "Classes - The Python Tutorial"
728x90