상속 — 부모의 기능을 물려받기 ★★★
상속(inheritance)은 기존 class(부모)의 attribute와 method를 새 class(자식)가 그대로 물려받아 쓰는 방법이에요. 자식은 class Dog(Animal):처럼 클래스 이름 뒤 괄호에 부모 이름을 적어요. 읽는 법은 "Dog는 Animal을 상속한다"예요.
부모 가게(Animal)의 레시피와 도구를 자식 가게(Dog)가 그대로 물려받아요. 자식은 거기에 자기만의 메뉴(bark)를 추가하거나, 같은 이름 메뉴를 자기 방식으로 바꿀 수 있어요. 물려받은 것을 매번 다시 만들 필요가 없어서 편해요. 동물 종이 1,000개일 때 이름 같은 공통 기능을 부모에 한 번만 쓰면 돼요(교수님 설명).
| 코드 줄 | 무슨 뜻 |
|---|---|
class Dog(Animal): | Dog는 Animal의 자식. Dog에는 bark만 직접 적혀 있어요 |
dog = Dog("Bori") | Dog에는 __init__이 없으니 부모의 __init__이 실행돼서 name = "Bori"가 저장돼요 |
dog.name | Bori. 부모의 __init__이 만든 attribute예요 |
dog.eat() | Dog에 eat가 없으니 부모 Animal의 eat를 찾아 실행해요 |
dog.bark() | Dog에 직접 정의된 bark 실행 |
메서드를 찾는 순서는 이래요. ① 자식 class에서 먼저 찾고, ② 없으면 부모 class에서 찾아요. 부모의 메서드가 자식에게 "복사되는" 것이 아니라 못 찾으면 부모에게 가서 찾는 거예요.
반대는 안 돼요. 부모의 객체는 자식에만 있는 메서드를 못 써요. 위 예에서 Animal("Zzz").bark()는 "Animal에는 bark가 없다"는 에러(AttributeError)예요. 부모는 공통 기능, 자식은 공통 기능 + 자기만의 기능을 가져요.
| 실행하는 줄 | 무슨 뜻 |
|---|---|
Wizard("Merlin", health=80, mana=20) | Wizard의 __init__ 실행. 이름표를 붙여 넘긴 값(health=80, mana=20)도 자리가 맞는 칸에 들어가요 |
super().__init__(name, health) | 부모(Character)의 __init__을 실행해 name, health를 저장 |
self.mana = mana | 자식만의 attribute 저장 |
wizard.take_damage(15) | Wizard에 없으니 부모의 take_damage 실행. 80−15 = 65 → "Merlin의 체력: 65" |
wizard.use_magic() | 자식의 메서드. mana 20 ≥ 10 → 10을 빼서 mana = 10 → "마법 사용, 남은 mana: 10" |
상속은 기존 class의 attribute와 method를 새 class에서 재사용하는 방법이다. 자식 class에서 메서드를 찾지 못하면 부모 class에서 찾아 사용한다(복사되는 것이 아니다). 부모 instance는 자식에만 있는 메서드를 사용할 수 없다.
잠깐 확인 — Dog 클래스에 eat 메서드가 없는데 dog.eat()을 부르면 왜 실행되나요?
자식에서 못 찾으면 부모(Animal)에서 찾아 쓰기 때문이에요. 부모의 eat가 실행돼요.
자료: 3~4주차 · Week03_Class_for_PyTorch(pdf, ipynb 업데이트본) · 빅데이터03(3주차)·빅데이터04(4주차) 녹취