파이썬 - 상속
파이썬에서 상속이란 무엇인가요?
상속은 오브젝트 지향 프로그래밍(OOP)에서 기본적인 개념으로, 하나의 클래스가 다른 클래스의 속성과 메서드를 상속받을 수 있게 합니다. 이를 통해 코드의 재사용성과 모듈성을 높일 수 있으며, 기존 클래스를 기반으로 새로운 클래스를 만들 때 동일한 코드를 다시 작성할 필요가 없습니다. 파이썬에서는 class
키워드 뒤에 부모 클래스의 이름을 괄호 안에 작성하여 상속을 구현합니다.
부모 클래스 생성
먼저 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!"
이 경우, Snake
와 Lizard
클래스는 모두 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