파이썬 - 상속

파이썬에서 상속이란 무엇인가요?

상속은 오브젝트 지향 프로그래밍(OOP)에서 기본적인 개념으로, 하나의 클래스가 다른 클래스의 속성과 메서드를 상속받을 수 있게 합니다. 이를 통해 코드의 재사용성과 모듈성을 높일 수 있으며, 기존 클래스를 기반으로 새로운 클래스를 만들 때 동일한 코드를 다시 작성할 필요가 없습니다. 파이썬에서는 class 키워드 뒤에 부모 클래스의 이름을 괄호 안에 작성하여 상속을 구현합니다.

Python - Inheritance

부모 클래스 생성

먼저 Animal라는 간단한 부모 클래스를 생성해 보겠습니다:

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

def speak(self):
raise NotImplementedError("Subclass must implement this method")

이 예제에서는 Animal 클래스를 정의하고, __init__ 메서드를 통해 name 속성을 초기화하고, speak 메서드를 통해 NotImplementedError를 발생시킵니다. 서브클래스에서 speak 메서드의 자체 구현을 제공하지 않으면 이 오류가 발생합니다.

자식 클래스 생성

이제 Animal 클래스를 상속받은 Dog라는 자식 클래스를 생성해 보겠습니다:

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

Dog 클래스는 Animal 클래스의 모든 속성과 메서드를 상속받지만, 자체 구현의 speak 메서드를 제공합니다. Dog 클래스의 인스턴스를 생성하고 speak 메서드를 호출하면 "[개의 이름] says Woof!"를 반환하며 오류가 발생하지 않습니다.

my_dog = Dog("Buddy")
print(my_dog.speak())  # Output: Buddy says Woof!

상속의 유형

파이썬에서는 단일 상속, 다중 상속, 다중 레벨 상속, 层次적 상속이 있습니다. 각 유형을 자세히 탐구해 보겠습니다.

파이썬 - 단일 상속

단일 상속은 가장 일반적인 상속 형태로, 클래스가 하나의 부모 클래스만 상속받습니다. 위에서 본 것처럼, Dog 클래스가 Animal 클래스를 상속받는 것은 단일 상속의 예입니다.

파이썬 - 다중 상속

다중 상속은 클래스가 두 개 이상의 부모 클래스를 상속받는 경우입니다. 하지만 파이썬은 클래스 정의 문법으로 직접 다중 상속을 지원하지 않습니다. 대신 "믹스인"이나 "인터페이스" 기술을 사용하여 다중 상속을 달성합니다.

메서드 결정 순서 (MRO)

파이썬은 메서드를 검색할 때 베이스 클래스를 탐색하는 순서를 결정하기 위해 C3 선형화 알고리즘을 사용합니다. MRO는 각 클래스가 메서드 결정 순서에서 최대한 한 번만 등장하며, 클래스 정의에서 베이스 클래스들의 순서를 유지합니다.

파이썬 - 다중 레벨 상속

다중 레벨 상속은 클래스가 서브클래스를 상속받아 클래스 계층 구조를 형성하는 경우입니다. 예를 들어:

class Mammal(Animal):
pass

class Cat(Mammal):
def speak(self):
return f"{self.name} says Meow!"

이 경우, Cat 클래스는 Mammal 클래스를 상속받고, Mammal 클래스는 Animal 클래스를 상속받습니다. 이렇게 다중 레벨 상속 계층 구조가 형성됩니다.

파이썬 - 层次적 상속

层次적 상속은 여러 서브클래스가 하나의 슈퍼클래스를 상속받는 경우입니다. 예를 들어:

class Reptile(Animal):
pass

class Snake(Reptile):
def speak(self):
return f"{self.name} says Hiss!"

class Lizard(Reptile):
def speak(self):
return f"{self.name} says Crawl!"

이 경우, SnakeLizard 클래스는 모두 Reptile 클래스를 상속받고, Reptile 클래스는 Animal 클래스를 상속받습니다. 이렇게 层次적 상속 구조가 형성됩니다.

파이썬 - 하이브리드 상속

하이브리드 상속은 다중 상속과 기타 유형의 상속의 특징을 결합한 것입니다. 파이썬에서는 직접 지원하지 않지만, 믹스인이나 다른 유형의 상속을 결합하여 달성할 수 있습니다.

super() 함수

super() 함수는 서브클래스 내에서 부모 클래스의 메서드를 호출하는 데 사용됩니다. 특히 부모 클래스의 메서드를 확장하거나 재정의하면서 일부 기능을 유지하고 싶을 때 유용합니다. 예를 들어:

class Bird(Animal):
def __init__(self, name, wingspan):
super().__init__(name)
self.wingspan = wingspan

def speak(self):
return f"{self.name} says Chirp!"

이 경우, Bird 클래스는 Animal 클래스를 상속받고, super() 함수를 사용하여 부모 클래스의 __init__ 메서드를 호출합니다. 이를 통해 name 속성이 올바르게 초기화됩니다. 또한, Bird 클래스는 자체 구현의 speak 메서드를 제공합니다.

my_bird = Bird("Tweety", 10)
print(my_bird.speak())  # Output: Tweety says Chirp!

상속을 사용하면 부모 클래스의 기능을 상속받고 확장하는 더 특화된 클래스를 만들 수 있으며, 코드의 재사용성과 조직성을 높일 수 있습니다. 상속은 OOP의 하나의 측면일 뿐만 아니라, 다형성, 캡슐화, 추상화와 같은 다른 개념들도 견고하고 유지보수하기 쉬운 소프트웨어 시스템을 설계하는 데 중요한 역할을 합니다.

Credits: Image by storyset