일단 본론에 들어가기 전에 하나만 설명하면 스페셜 메소드 __init__는 생성자가 아닙니다

인스턴스 생성은 __init__가 호출되기 전 이루어지고 (__init__가 아닌 다른 메소드들로 생성 과정에 개입할 수 있으나 이건 나중에 더 공부하시고)

__init__은 초기화 메소드입니다


본론에 들어가면


obj = Class

obj = Class(something)


위의 두가지는 큰 차이가 있습니다


전자는 obj 변수에 Class 그 자체를 할당하게 됩니다 (자세히는 파이썬에서는 클래스 자체도 객체고 이 객체가 obj에 할당됩니다)

님께 일어난 문제는 __init__ 때문인데 전자의 경우는 인스턴스 생성 및 초기화가 안 일어나고 따라서 __init__가 호출되지 않아 에러가 안 난 겁니다


후자는 넘어온 인자들을 이용하여 인스턴스 생성 및 초기화가 진행됩니다

그런데 __init__(self, a) 이런 식으로 디폴트값이 없는 초기화 함수를 정의해놓고

obj = Class() 같이 아무 인자도 안 넘기면 요구만 있고 공급이 없으므로 에러가 납니다

__init__(self, a=0) 이런 식으로 디폴트값을 넣어주세요

참고로 a=0보다는 a=None으로 해주고

바디에서 if a is None: a=0 으로 처리해주는게 일반적인 컨벤션입니다

사실 디폴트 값이 0처럼 불변값인 경우는 이래하나 저래하나 큰 상관없지만 그래도 None으로 미리 습관을 들여놓으면 좋습니다