한양과학기술고등학교

에듀테크 프로젝트 대시보드

상속 · 다형성

super MRO override isinstance ABC

하위 클래스는 상위의 속성·메서드를 물려받고 super() 로 상위 구현을 호출합니다.

1. 기본 상속

class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        raise NotImplementedError

class Dog(Animal):
    def speak(self):                 # 오버라이딩
        return f"{self.name}: 멍"

class Cat(Animal):
    def speak(self):
        return f"{self.name}: 야옹"

for a in [Dog("바둑"), Cat("나비")]:
    print(a.speak())                 # 다형성 — 같은 호출, 다른 동작

2. super()

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

class Manager(Employee):
    def __init__(self, name, salary, team):
        super().__init__(name, salary)   # 상위 __init__ 재사용
        self.team = team

    def describe(self):
        base = super().describe() if hasattr(super(), "describe") else ""
        return f"{self.name}, 팀 {len(self.team)}명"

3. isinstance / issubclass

d = Dog("바둑")
isinstance(d, Dog)         # => True
isinstance(d, Animal)     # => True  (상위도 True)
isinstance(d, (Cat, Dog)) # => True  (튜플 중 하나)
issubclass(Dog, Animal)   # => True

type(d) is Dog            # 정확히 그 타입인지 (상속 무시)

# 타입 검사보다 덕 타이핑 선호: hasattr(x, "speak")

4. 다중 상속과 MRO

class A:
    def go(self): print("A")
class B(A):
    def go(self): print("B"); super().go()
class C(A):
    def go(self): print("C"); super().go()
class D(B, C):
    def go(self): print("D"); super().go()

D().go()          # D → B → C → A  (super 체인)
D.__mro__         # 메서드 탐색 순서 (C3 선형화)

# 믹스인 패턴
class JsonMixin:
    def to_json(self): import json; return json.dumps(self.__dict__)

5. 추상 베이스 클래스

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self) -> float: ...

    def describe(self):              # 구체 메서드도 가능
        return f"넓이 {self.area()}"

# s = Shape()          # TypeError — 추상 클래스는 인스턴스화 불가
class Square(Shape):
    def __init__(self, side): self.side = side
    def area(self): return self.side ** 2   # 반드시 구현해야

6. 상속보다 합성

"is-a" vs "has-a"
  • 상속은 진짜 is-a 관계일 때만 (Dog is an Animal)
  • 기능 재사용이 목적이면 합성: 객체를 속성으로 보유하고 위임
  • 깊은 상속 계층은 이해·수정이 어려움 — 2~3단계 이내 권장
"지금 하는 것이 아예 안 하는 것보다 낫다 — 다만 '지금 당장'보다는 낫지 않을 때가 많다"