Skip to content

KR_Inheritance

somaz edited this page Apr 21, 2025 · 3 revisions

📌 Python 상속과 다형성 개념 정리


1️⃣ 상속 기초

클래스 간의 코드 재사용을 위한 메커니즘입니다.

# 기본 상속
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return f"{self.name}가 멍멍!"

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

dog = Dog("멍멍이")
print(dog.speak())  # 멍멍이가 멍멍!

특징:

  • 코드 재사용
  • 메서드 오버라이딩
  • 계층 구조

2️⃣ 다중 상속

class Flying:
    def fly(self):
        return "날 수 있음"

class Swimming:
    def swim(self):
        return "수영할 수 있음"

class Duck(Flying, Swimming):
    def __init__(self, name):
        self.name = name

특징:

  • 여러 클래스 상속
  • 기능 조합
  • MRO 고려

3️⃣ super() 사용

class Parent:
    def __init__(self, name):
        self.name = name
    
    def greet(self):
        return f"안녕, 나는 {self.name}"

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age
    
    def greet(self):
        return super().greet() + f", {self.age}살이야"

특징:

  • 부모 클래스 메서드 호출
  • 초기화 체인
  • 메서드 확장

4️⃣ 추상 클래스

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass
    
    @abstractmethod
    def perimeter(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def perimeter(self):
        return 2 * (self.width + self.height)

특징:

  • 인터페이스 정의
  • 구현 강제
  • 설계 명확화

5️⃣ 믹스인(Mixin) 패턴

class JSONMixin:
    def to_json(self):
        import json
        return json.dumps(self.__dict__)

class User(JSONMixin):
    def __init__(self, name, age):
        self.name = name
        self.age = age

user = User("홍길동", 30)
print(user.to_json())  # {"name": "홍길동", "age": 30}

특징:

  • 기능 재사용
  • 코드 모듈화
  • 유연한 확장

주요 팁

모범 사례:

  • 단일 상속 우선 사용
  • 다중 상속 시 MRO 고려
  • 추상 클래스로 인터페이스 정의
  • super() 활용하여 부모 클래스 메서드 호출
  • 적절한 메서드 오버라이딩으로 다형성 구현
  • 믹스인으로 기능 확장
  • 타입 검사 활용 (isinstance, issubclass)
  • 명확한 계층 구조 설계

Clone this wiki locally