상속
상속
상속(Inheritance)은 객체지향래밍(Object-Oriented Programming,OP)의 핵심 개념 중 하나로, 기존 클래스의 속성과 메서드를 새로운 클래스가 그대로 물려받아 재사용하고 확장할 수 있도록 해 메커니즘. 이는 코드의 중복을 줄이고, 프로그램의 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다.
개요
상속을 통해 개발자는 기존에 정의된 클래스(부모 클래스 또는 슈퍼클래스)의 기능을 새로운 클래스(자식 클래스 또는 서브클래스)에서 재사용할 수 있습니다. 자식 클래스는 부모 클래스의 모든 공개(public) 및 보호(protected) 멤버를 접근할 수 있으며, 필요에 따라 새로운 속성과 메서드를 추가하거나 기존 메서드를 오버라이딩(Overriding)하여 기능을 변경할 수 있습니다.
상속은 "is-a" 관계를 표현하는 데 적합합니다. 예를 들어, 자동차
클래스가 있고, 전기차
클래스가 자동차
를 상속받는 경우, "전기차는 자동차이다"라는 의미를 자연스럽게 표현할 수 있습니다.
상속의 기본 구조
부모 클래스와 자식 클래스
- 부모 클래스(Parent Class): 다른 클래스가 상속받는 원본 클래스. 기반 클래스(Base Class) 또는 슈퍼클래스(Superclass)라고도 부릅니다.
- 자식 클래스(Child Class): 부모 클래스로부터 속성과 메서드를 상속받는 클래스. 파생 클래스(Derived Class) 또는 서브클래스(Subclass)라고도 합니다.
예시 코드 (Python 기준)
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return f"{self.name}이(가) 소리를 냅니다."
class Dog(Animal): # Animal 클래스를 상속
def speak(self): # 메서드 오버라이딩
return f"{self.name}이(가) 멍멍하고 짖습니다."
# 사용 예시
my_dog = Dog("바둑이")
print(my_dog.speak()) # 출력: 바둑이이(가) 멍멍하고 짖습니다.
위 코드에서 Dog
클래스는 Animal
클래스를 상속받아 name
속성과 speak()
메서드를 사용할 수 있으며, speak()
메서드를 오버라이딩하여 구체적인 동작을 정의하고 있습니다.
상속의 유형
상속은 언어와 설계에 따라 다양한 형태로 구현될 수 있습니다.
1. 단일 상속 (Single Inheritance)
한 클래스가 단 하나의 부모 클래스만을 상속받는 방식입니다. 대부분의 객체지향 언어에서 기본적으로 지원됩니다.
class Parent:
pass
class Child(Parent):
pass
2. 다중 상속 (Multiple Inheritance)
한 클래스가 두 개 이상의 부모 클래스를 동시에 상속받는 방식입니다. Python과 C++ 등 일부 언어에서 지원하지만, 다이아몬드 문제(Diamond Problem)와 같은 복잡성을 유발할 수 있습니다.
class A:
def method(self):
print("A의 메서드")
class B(A):
pass
class C(A):
def method(self):
print("C의 메서드")
class D(B, C): # 다중 상속
pass
d = D()
d.method() # 출력: "C의 메서드" (메서드 해석 순서: MRO)
Python은 MRO(Method Resolution Order)를 사용하여 다중 상속 시 메서드 호출 순서를 결정합니다.
3. 계층적 상속 (Hierarchical Inheritance)
한 부모 클래스가 여러 자식 클래스에 의해 상속되는 구조입니다.
Animal:
def eat(self):
print("먹는다")
class Dog(Animal):
def bark(self):
print("짖는다")
class Cat(Animal):
def meow(self):
print("야옹한다")
상속의 장점
- 코드 재사용성: 중복된 코드를 줄이고, 공통 기능을 한 곳에서 관리할 수 있습니다.
- 확장성: 기존 클래스를 변경하지 않고 새로운 기능을 추가할 수 있습니다.
- 유지보수성: 공통 로직이 한 클래스에 집중되어 있어 수정이 용이합니다.
- 다형성 지원: 상속은 다형성(Polymorphism)을 구현하는 기초가 됩니다.
주의사항 및 한계
- 과도한 상속은 복잡성 증가: 깊은 상속 계층은 코드 이해를 어렵게 만들 수 있습니다.
- 결합도 증가: 자식 클래스는 부모 클래스에 강하게 결합되어 있어, 부모 클래스 변경 시 영향을 받을 수 있습니다.
- 다중 상속의 위험성: 명확한 설계 없이 다중 상속을 사용하면 예측할 수 없는 동작이 발생할 수 있습니다.
이러한 문제를 피하기 위해, 현대 소프트웨어 설계에서는 "상속보다는 구성(Favor composition over inheritance)"이라는 원칙을 권장합니다.
관련 개념
- 추상 클래스(Abstract Class): 인스턴스를 생성할 수 없고, 상속을 위해 설계된 클래스로, 일부 메서드는 구현 없이 정의됩니다.
- 인터페이스(Interface): 메서드의 시그니처만 정의하고, 구현은 자식 클래스에서 완료하도록 강제하는 설계 방식 (Java, C# 등).
- 오버라이딩(Overriding): 자식 클래스가 부모 클래스의 메서드를 재정의하는 것.
- 오버로딩(Overloading): 같은 이름의 메서드를 매개변수로 구분하여 여러 개 정의하는 것 (Python은 기본적으로 미지원).
참고 자료
- Gamma, E., et al. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.
- Python 공식 문서 - Inheritance
- Oracle Java Tutorials - Interfaces and Inheritance
상속은 객체지향 설계의 기초이지만, 적절한 설계 원칙과 함께 사용되어야 효과적인 소프트웨어 아키텍처를 구축할 수 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.