1. 상속(Inheritance)이란?
상속은 객체지향 프로그래밍의 중요한 개념 중 하나로, 하나의 클래스가 다른 클래스를 기반으로 하여 그 속성과 메서드를 물려받는 것을 의미합니다. 상속을 통해 기존 클래스의 기능을 재사용하거나 확장할 수 있으며, 코드를 더 효율적이고 관리하기 쉽게 만듭니다.
예시:
# 부모 클래스
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name} makes a sound.")
# 자식 클래스
class Dog(Animal):
def speak(self):
print(f"{self.name} barks.")
# 'Animal' 클래스를 상속받은 'Dog' 클래스
dog = Dog("Buddy")
dog.speak() # 출력: Buddy barks.
설명:
위 코드에서 Dog
클래스는 Animal
클래스를 상속받았습니다. Dog
는 Animal
의 속성인 name
을 그대로 사용하고 있지만, speak()
메서드는 Dog
클래스에서 재정의(오버라이드)하여 barks
로 출력합니다.
2. 확장(Extension)이란?
확장은 상속을 통해 기존 클래스를 기반으로 새로운 속성이나 메서드를 추가하는 것입니다. 즉, 부모 클래스의 기능을 그대로 사용하면서 추가적인 기능을 제공하는 것을 의미합니다.
예시:
# 부모 클래스
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name} makes a sound.")
# 자식 클래스 - 상속을 통해 기능 확장
class Cat(Animal):
def __init__(self, name, color):
super().__init__(name) # 부모 클래스의 초기화 메서드 호출
self.color = color
def speak(self):
print(f"{self.name} meows.")
def describe(self):
print(f"{self.name} is a {self.color} cat.")
# 'Animal' 클래스를 확장한 'Cat' 클래스
cat = Cat("Whiskers", "black")
cat.speak() # 출력: Whiskers meows.
cat.describe() # 출력: Whiskers is a black cat.
설명:
여기서 Cat
클래스는 Animal
클래스를 확장하여 새로운 속성 color
와 메서드 describe()
를 추가했습니다. super().__init__(name)
은 부모 클래스의 생성자를 호출하여 상속받은 name
속성을 초기화하는 부분입니다.
3. 인터페이스(Interface)란?
파이썬에는 자바와 같은 명시적인 "인터페이스" 개념은 없지만, 추상 클래스와 추상 메서드를 사용하여 인터페이스와 유사한 동작을 구현할 수 있습니다. 인터페이스는 클래스가 반드시 구현해야 할 메서드를 정의하고, 이러한 메서드를 구현한 클래스는 그 인터페이스를 "따른다"고 말할 수 있습니다.
파이썬에서 인터페이스를 구현할 때는 abc
모듈을 사용합니다.
예시:
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)
# 'Shape' 인터페이스를 구현한 'Rectangle' 클래스
rect = Rectangle(5, 10)
print(f"Area: {rect.area()}") # 출력: Area: 50
print(f"Perimeter: {rect.perimeter()}") # 출력: Perimeter: 30
설명:
여기서 Shape
클래스는 추상 클래스(인터페이스 역할)를 하며, area()
와 perimeter()
메서드를 정의하지만 구체적인 구현은 없습니다. Rectangle
클래스는 이 Shape
클래스를 상속받아 그 메서드들을 실제로 구현합니다.
인터페이스를 사용하면 다양한 클래스들이 동일한 메서드를 가질 것을 보장할 수 있기 때문에, 다형성(polymorphism)을 활용한 유연한 설계가 가능합니다.
4. 상속과 확장의 차이점
- 상속은 기존 클래스를 그대로 물려받아 사용하는 것을 말하며, 기존 클래스를 수정하지 않고 새로운 기능을 추가하는 데 주로 사용됩니다.
- 확장은 상속을 기반으로 기존 기능에 새로운 속성이나 메서드를 추가하는 방식입니다.
5. 상속과 인터페이스의 장단점
장점:
- 재사용성: 코드의 중복을 줄이고, 기존 클래스를 재사용하여 새로운 클래스를 쉽게 만들 수 있습니다.
- 유지보수성: 부모 클래스에서 기능을 수정하면, 그 기능을 상속받는 자식 클래스에도 자동으로 적용되어 유지보수가 용이합니다.
- 유연성: 인터페이스와 추상 클래스를 통해 여러 클래스들이 동일한 메서드를 구현하도록 보장할 수 있어 다형성을 지원합니다.
단점:
- 높은 결합도: 잘못된 설계로 상속을 남용하면 클래스 간의 의존성이 커져 유지보수가 어렵게 될 수 있습니다.
- 복잡성 증가: 상속 구조가 깊어질수록 코드의 흐름을 파악하기 어려워질 수 있습니다.
결론
상속과 확장은 객체지향 프로그래밍의 중요한 개념으로, 코드의 재사용성과 유지보수성을 높여 줍니다. 파이썬에서는 추상 클래스를 사용하여 인터페이스를 구현할 수 있으며, 이를 통해 여러 클래스들이 동일한 메서드를 구현하도록 설계할 수 있습니다. 주니어 엔지니어로서 상속과 인터페이스를 올바르게 이해하면 더욱 효율적이고 확장 가능한 소프트웨어를 설계할 수 있을 것입니다.
'프로그래밍공부(Programming Study) > 파이썬(Python)' 카테고리의 다른 글
추상 메서드와 추상 클래스란? (1) | 2024.09.08 |
---|---|
파이썬 nonlocal 키워드 완벽 이해: 중첩 함수에서 변수 관리하기 (0) | 2024.08.09 |
파이썬 클로저로 이해하는 데이터 은닉, 팩토리 함수, 데코레이터 패턴 (1) | 2024.08.09 |
파이썬의 일급 객체와 클로저 개념 이해 (0) | 2024.08.09 |
댓글