1. 객체지향 프로그래밍(OOP) 개요 (이전 시리즈 요약)
이전 글에서는 클래스와 객체의 개념을 다루었으며, 다음과 같은 핵심 개념을 배웠습니다:
- 클래스(Class): 객체를 만들기 위한 설계도
- 객체(Object): 클래스를 기반으로 생성된 실체
- 메서드(Method): 클래스 내부에서 정의된 함수
- 인스턴스 변수 vs. 클래스 변수: 객체별로 독립적인 변수 vs. 모든 객체가 공유하는 변수
- 클래스 메서드와 정적 메서드: 클래스 자체를 조작하는 메서드 vs. 독립적인 연산 수행
이번 글에서는 **상속(Inheritance)**과 **다형성(Polymorphism)**을 다루며, 객체지향 프로그래밍의 강력한 기능을 활용하는 방법을 배워보겠습니다.
2. 상속(Inheritance)란?
상속은 기존 클래스의 기능을 물려받아 새로운 클래스를 생성하는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 유지보수를 쉽게 할 수 있습니다.
✅ 기본 상속 예제
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
return "소리를 냅니다."
# Animal 클래스를 상속하는 Dog 클래스
class Dog(Animal):
def make_sound(self):
return "멍멍!"
# 객체 생성
dog = Dog("바둑이")
print(dog.name) # 부모 클래스의 속성
print(dog.make_sound()) # 자식 클래스에서 오버라이딩된 메서드
🖥 실행 결과
바둑이
멍멍!
🔹 Dog 클래스는 Animal 클래스를 상속받아 make_sound() 메서드를 재정의(오버라이딩)했습니다.
3. super()를 활용한 부모 클래스 접근
자식 클래스에서 부모 클래스의 메서드를 호출하고 싶을 때 super()를 사용합니다.
🔹 예제: super() 사용하기
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
return "소리를 냅니다."
class Cat(Animal):
def __init__(self, name, color):
super().__init__(name) # 부모 클래스의 __init__ 호출
self.color = color
def describe(self):
return f"{self.color} 색상의 {self.name} 고양이입니다."
cat = Cat("나비", "검은색")
print(cat.describe())
🖥 실행 결과
검은색 색상의 나비 고양이입니다.
🔹 super().__init__(name)을 사용하여 부모 클래스의 생성자를 호출하고, 추가 속성을 정의했습니다.
4. 다중 상속(Multiple Inheritance)
파이썬에서는 한 클래스가 여러 부모 클래스를 상속받을 수 있습니다.
🔹 예제: 다중 상속 구현
class Flyable:
def fly(self):
return "날 수 있습니다."
class Bird(Animal, Flyable): # Animal과 Flyable 모두 상속
def make_sound(self):
return "짹짹!"
bird = Bird("참새")
print(bird.make_sound()) # Animal로부터 상속받은 속성 사용
print(bird.fly()) # Flyable 클래스로부터 상속받은 메서드 사용
🖥 실행 결과
짹짹!
날 수 있습니다.
🔹 Bird 클래스는 Animal과 Flyable 클래스를 동시에 상속받아 두 클래스의 기능을 모두 활용합니다.
5. 다형성(Polymorphism) 이해하기
다형성은 동일한 메서드를 여러 클래스에서 다른 방식으로 구현할 수 있도록 하는 기능입니다.
🔹 예제: 다형성 활용하기
class Animal:
def make_sound(self):
return "소리를 냅니다."
class Dog(Animal):
def make_sound(self):
return "멍멍!"
class Cat(Animal):
def make_sound(self):
return "야옹!"
# 다형성 적용
def make_animal_sound(animal):
print(animal.make_sound())
animals = [Dog(), Cat(), Animal()]
for animal in animals:
make_animal_sound(animal)
🖥 실행 결과
멍멍!
야옹!
소리를 냅니다.
🔹 같은 make_sound() 메서드지만, 클래스마다 다르게 동작합니다.
6. 추상 클래스(Abstract Class)와 인터페이스
추상 클래스는 공통된 인터페이스를 제공하며, 특정 메서드의 구현을 강제할 수 있습니다.
🔹 예제: 추상 클래스 활용하기
from abc import ABC, abstractmethod
class Animal(ABC): # 추상 클래스 정의
@abstractmethod
def make_sound(self):
pass # 구현은 하위 클래스에서 정의
class Dog(Animal):
def make_sound(self):
return "멍멍!"
class Cat(Animal):
def make_sound(self):
return "야옹!"
# 객체 생성
dog = Dog()
cat = Cat()
print(dog.make_sound())
print(cat.make_sound())
🖥 실행 결과
멍멍!
야옹!
🔹 ABC 클래스를 상속받아 추상 클래스를 만들었으며, @abstractmethod를 사용하여 반드시 구현해야 할 메서드를 정의했습니다.
🎯 마무리
이 글에서는 상속과 다형성을 활용하여 객체지향 프로그래밍의 강력한 기능을 배웠습니다.
- 상속(Inheritance): 기존 클래스를 확장하여 코드 재사용성을 높임
- 다형성(Polymorphism): 같은 메서드 이름으로 다양한 기능을 수행
- 추상 클래스(Abstract Class): 공통 인터페이스를 제공하여 코드 구조화
다음 글에서는 캡슐화와 추상화를 더욱 깊이 다뤄보겠습니다! 🚀
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
'파이썬 > [객체지향 시리즈!]' 카테고리의 다른 글
📌 5. OOP 실전 프로젝트: 간단한 도서 관리 시스템 개발 (0) | 2025.02.07 |
---|---|
📌 4. 캡슐화와 추상화: 데이터 보호와 인터페이스 설계 (2) | 2025.02.06 |
📌 2. 파이썬 클래스와 객체: 기본 개념과 활용 (0) | 2025.02.04 |
📌 1. 객체지향 프로그래밍이란? (개념과 기본 원칙) (0) | 2025.02.03 |
댓글