C04.파이썬 다형성

학습 목표

이번 강의에서는 다형성(Polymorphism)의 개념을 이해하고, 서로 다른 클래스에서 동일한 메서드를 사용하는 방법을 배웁니다. 다형성을 통해 코드의 유연성을 높이고, 객체지향 프로그래밍의 이점을 활용하는 방법을 익힐 것입니다.

개념 설명

다형성은 동일한 인터페이스를 가진 객체들이 서로 다른 방식으로 행동할 수 있는 능력을 의미합니다. 이는 주로 메서드 오버라이딩(overriding)이나 메서드 이름의 일관성을 통해 구현됩니다. 다형성을 활용하면 서로 다른 클래스의 객체가 동일한 메서드를 호출할 때도 각기 다른 동작을 수행할 수 있습니다.

예제 코드

# Animal 부모 클래스 정의
class Animal:
    def speak(self):
        """각 동물이 소리를 내는 메서드 (기본 구현)"""
        raise NotImplementedError("서브 클래스에서 구현해야 합니다.")  # 서브 클래스에서 정의해야 함

# Dog 자식 클래스 정의
class Dog(Animal):
    def speak(self):
        return "멍멍!"  # 개의 소리

# Cat 자식 클래스 정의
class Cat(Animal):
    def speak(self):
        return "냥냥!"  # 고양이의 소리

# 메서드를 호출하는 함수
def animal_sound(animal):
    """동물 소리 출력 함수"""
    print(animal.speak())

# 인스턴스 생성
my_dog = Dog()  # Dog 클래스의 객체
my_cat = Cat()  # Cat 클래스의 객체

# 다형성을 활용하여 메서드 호출
animal_sound(my_dog)  # "멍멍!" 출력
animal_sound(my_cat)  # "냥냥!" 출력

코드 설명

위 코드는 다형성의 사용 예제를 보여줍니다.

  • Animal 부모 클래스는 speak 메서드를 정의하였지만, 기본 구현은 없고 이를 구현하기 위한 ‘NotImplementedError’를 포함합니다.
  • DogCat 클래스는 Animal 클래스를 상속받아 speak 메서드를 각각 오버라이드하여 각자 다른 소리를 반환합니다.
  • animal_sound 함수는 동물 객체를 인자로 받아 해당 동물의 소리를 출력하는 역할을 하며, 이 과정에서 다형성이 활용됩니다.

연습 문제

1. Bird 클래스를 추가하여 speak 메서드를 오버라이드하고, 여러 동물의 소리를 출력하는 함수를 작성해 보세요.

2. Shape라는 부모 클래스를 만들고 CircleRectangle라는 자식 클래스를 정의하여, 각 도형의 면적을 계산하는 메서드를 오버라이드하는 프로그램을 작성해 보세요.

연습 문제 해답

# 1번 문제: Bird 클래스 추가
class Bird(Animal):
    def speak(self):
        return "짹짹!"  # 새의 소리

# 여러 동물의 소리를 출력하는 함수
def animal_sounds(animals):
    """동물 리스트의 소리를 출력하는 함수"""
    for animal in animals:
        print(animal.speak())

# 인스턴스 생성
my_bird = Bird()  # Bird 클래스의 객체
animals = [my_dog, my_cat, my_bird]

# 다형성을 활용하여 모든 동물의 소리를 출력
animal_sounds(animals)  # "멍멍!", "냥냥!", "짹짹!" 출력

# 2번 문제: Shape 클래스와 도형 클래스 정의
import math

class Shape:
    def area(self):
        raise NotImplementedError("서브 클래스에서 구현해야 합니다.")

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return math.pi * (self.radius ** 2)  # 면적 계산

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height  # 면적 계산

# 각 도형의 면적을 계산하는 프로그램
shapes = [Circle(5), Rectangle(4, 6)]

for shape in shapes:
    print("도형의 면적:", shape.area())  # 각 도형의 면적 출력

### 설명
– **다형성의 개념**을 소개하고, 동물 소리 예제를 통해 서로 다른 클래스가 동일한 메서드를 사용하는 방법을 보여줍니다.
– **인스턴스 생성**과 **메서드 오버라이딩**을 통해 각 클래스의 고유한 동작을 구현하는 방법을 설명합니다.
– **연습 문제**를 통해 사용자가 직접 클래스를 추가하여 다형성을 활용하는 경험을 쌓을 수 있도록 돕습니다. 이는 객체지향 프로그래밍의 기본 원리를 이해하고 구현하는 데 도움이 됩니다.

댓글 남기기