C
Python/객체지향/Lesson 18

클래스 상속

45분·theory
이 챕터
2/3
Python

클래스 상속

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ 단일 상속 vs 다중 상속 + MRO (Method Resolution Order)
  • ✅ super() 사용 시점
  • ✅ 추상 클래스 (abc.ABC + @abstractmethod)

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

상속 — 코드 + 실행 결과

class 자식(부모): = 부모의 속성·메서드 그대로 + 자식이 추가·재정의.


1. 기본 상속

python
class 동물:
    def __init__(self, 이름):
        self.이름 = 이름

    def 소개(self):
        print(f"나는 {self.이름}")

class 강아지(동물):    # 동물 상속
    def 짖기(self):
        print("멍멍!")

뽀삐 = 강아지("뽀삐")
뽀삐.소개()           # 나는 뽀삐 ← 부모 메서드
뽀삐.짖기()           # 멍멍!     ← 자식 메서드

2. 메서드 재정의 (override)

python
class 동물:
    def 소리(self):
        print("???")

class 강아지(동물):
    def 소리(self):                # 부모 메서드 덮어씀
        print("멍멍!")

class 고양이(동물):
    def 소리(self):
        print("야옹~")

동물들 = [강아지(), 고양이()]
for a in 동물들:
    a.소리()
# 멍멍!
# 야옹~

같은 메서드명, 다른 동작 = 다형성 (polymorphism).


3. super() — 부모 메서드 호출

python
class 동물:
    def __init__(self, 이름):
        self.이름 = 이름

class 강아지(동물):
    def __init__(self, 이름, 견종):
        super().__init__(이름)         # 부모 __init__ 먼저
        self.견종 = 견종

뽀삐 = 강아지("뽀삐", "푸들")
print(뽀삐.이름, 뽀삐.견종)            # 뽀삐 푸들

4. isinstance — 부모 타입 검사

python
뽀삐 = 강아지("뽀삐")
print(isinstance(뽀삐, 강아지))       # True
print(isinstance(뽀삐, 동물))         # True (부모도 OK)

5. 다중 상속 (신중히)

python
class 헤엄칠수있음:
    def 헤엄(self): print("첨벙")

class 날수있음:
    def 날기(self): print("훨훨")

class 오리(헤엄칠수있음, 날수있음):    # 둘 다 상속
    pass

d = 오리()
d.헤엄()      # 첨벙
d.날기()      # 훨훨

한 줄 요약

class 자식(부모): + super().메서드() + 메서드 재정의 = 상속의 90%.

💻 상속 예제
# ============================================
# 📌 이 코드가 하는 일: 상속으로 공통 기능을 부모 클래스에서 물려받습니다
# 📌 실생활 비유: 상속은 '유전'과 같습니다.
#    강아지(Dog)는 동물(Animal)의 특성을 물려받고,
#    자신만의 고유한 특성(breed, 멍멍)을 추가합니다.
# ============================================

# 🔹 부모 클래스 (기반 클래스): 공통 속성과 메서드를 정의합니다
class Animal:
    def __init__(self, name):
        self.name = name  # 🔹 모든 동물의 공통 속성

    def speak(self):
        return "소리를 냅니다"  # 🔹 기본 구현 (자식 클래스에서 재정의 예정)

# 🔹 자식 클래스: 괄호 안에 부모 클래스를 적어 상속 선언
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 🔹 super(): 부모 클래스의 __init__ 호출 (name 초기화)
        self.breed = breed      # 🔹 Dog만의 추가 속성

    def speak(self):  # 🔹 메서드 오버라이딩: 부모의 speak를 Dog에 맞게 재정의
        return "멍멍!"

    def fetch(self):  # 🔹 Dog만의 새 메서드 추가 (Animal에는 없음)
        return f"{self.name}가 공을 물어옵니다"

class Cat(Animal):
    def speak(self):  # 🔹 Cat도 speak 오버라이딩
        return "야옹!"
    # 🔹 __init__ 미정의 → 부모(Animal)의 __init__ 자동 사용

# 🔹 사용
dog = Dog("바둑이", "진돗개")
cat = Cat("나비")

print(dog.speak())   # ✅ 실행 결과: 멍멍! (오버라이딩된 메서드)
print(cat.speak())   # ✅ 실행 결과: 야옹! (오버라이딩된 메서드)
print(dog.fetch())   # ✅ 실행 결과: 바둑이가 공을 물어옵니다 (Dog 고유 메서드)
# ❌ cat.fetch() → AttributeError: Cat에는 fetch 없음

# 🔹 상속 관계 확인
print(isinstance(dog, Animal))  # ✅ 실행 결과: True (Dog는 Animal의 인스턴스)
print(isinstance(dog, Dog))     # ✅ 실행 결과: True
print(issubclass(Dog, Animal))  # ✅ 실행 결과: True (Dog는 Animal의 서브클래스)

💡 핵심 포인트

1. class 자식(부모): 형태로 상속
2. super()로 부모 메서드 호출
3. isinstance(), issubclass()로 관계 확인

Python의 OOP는 클래스(class)로 객체를 정의합니다. __init__은 생성자, self는 인스턴스 참조입니다. 상속은 class Child(Parent)로 구현하며, super()로 부모 메서드를 호출합니다. @property로 getter/setter 구현, @classmethod/@staticmethod로 클래스/정적 메서드를 정의합니다. 다중 상속과 MRO(Method Resolution Order)도 지원합니다.

🐍 실행해보기 — 클래스 상속

위 개념을 실제로 코드로 실행해보세요. 값을 바꿔가며 어떻게 동작하는지 직접 확인하는 게 가장 빠른 학습.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 dict 기반 자료구조를 dataclass 로 바꿔줘"
  • "이 클래스에 __repr__ · __eq__ 적절히 추가해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: 클래스 기초
상속 - Python