시험공부빅데이터분석
← 보드클래스와 상속 · 6/12

super().__init__() — 부모의 __init__은 자동으로 안 불려요 ★★★ 시험 단골

상속에서 가장 헷갈리고 시험에 잘 나오는 부분이에요. 자식이 자기 __init__을 정의하면, 부모의 __init__은 자동으로 실행되지 않아요. 자식 것이 부모 것을 "덮어쓰기" 때문이에요. 교수님은 "얘가 불리면 얘는 안 불린다는 게 문제"라고 표현했어요.

그래서 부모가 만들던 attribute(예 name)가 필요하면 자식의 __init__ 안에서 super().__init__(...)로 부모의 초기화를 직접 불러줘야 해요. super()는 "부모 클래스"를 가리켜요.

Animal (부모) __init__ : name 저장 Dog (자식) __init__ : breed 저장 super().__init__(name) 이 줄이 있어야 부모의 name 저장이 실행돼요

세 가지 경우를 비교해 볼게요. 모두 Animal(name 저장)을 부모로 해요.

자식의 모양부모 __init__은?dog.name을 쓰면
자식에 __init__이 없음자동으로 부모 것을 사용사용 가능
자식에 __init__이 있고 super().__init__(name)이 없음실행 안 됨에러 (name이 없음)
자식에 __init__이 있고 super().__init__(name)이 있음직접 불러서 실행됨사용 가능
class Dog(Animal): def __init__(self, name, breed): super().__init__(name) self.breed = breed dog = Dog("Bori", "Poodle") print("name:", dog.name) print("breed:", dog.breed) dog.eat()
name: Bori breed: Poodle Bori가 밥을 먹습니다.
코드 줄무슨 뜻
def __init__(self, name, breed):자식은 재료를 두 개(이름, 품종) 받아요
super().__init__(name)부모의 __init__을 name으로 실행 → self.name = "Bori"가 저장돼요
self.breed = breed자식이 추가한 attribute. 부모가 만든 name이든 자식이 만든 breed든 결국 같은 객체의 attribute일 뿐이에요

만약 super().__init__(name) 줄을 빼면 어떻게 될까요? dog.breed는 되지만 dog.name에서 "Dog 객체에는 name이 없다"는 에러(AttributeError)가 나요. 부모의 name 저장 줄이 한 번도 실행되지 않았기 때문이에요. 그래서 dog.eat()도 안에서 self.name을 쓰다가 같은 에러가 나요.

외우기 팁

"자식이 __init__을 가지면, super().__init__()을 꼭 부른다". 부모의 재료를 받으려면 자식이 받은 재료 중 부모 몫(name)을 super().__init__(name)으로 넘겨요.

시험엔 이렇게 써요 — 이렇게 고르세요

자식 class가 __init__()을 정의(오버라이딩)하면 부모의 __init__()은 자동으로 호출되지 않는다. 부모가 초기화하는 attribute를 사용하려면 자식의 __init__() 안에서 super().__init__()을 호출해야 한다. 선택지에 "부모의 __init__()은 항상 자동으로 실행된다"가 있으면 오답이에요.

잠깐 확인 — 자식 __init__에서 super().__init__(name)을 빠뜨리면 어떤 일이 생기나요?

부모가 저장하던 self.name이 만들어지지 않아서, 나중에 self.name을 쓰는 순간 attribute가 없다는 에러가 나요.

다음 카드 → 오버라이딩 — 같은 이름 메서드를 자식이 새로 쓰기 ★★★ 시험 2번

자료: 3~4주차 · Week03_Class_for_PyTorch(pdf, ipynb 업데이트본) · 빅데이터03(3주차)·빅데이터04(4주차) 녹취