Programming Languages/Python

다형성 (Polymorphism)

newclass 2025. 3. 26. 04:07

다형성(Polymorphism)

1. 다형성이란?

다형성은 같은 이름의 메서드가 다른 클래스에서 다른 기능을 수행할 수 있게 하는 개념입니다. 이를 통해 여러 객체 타입에 대해 동일한 인터페이스를 사용할 수 있으며, 코드의 유연성과 확장성이 높아집니다.

2. 메서드 오버라이딩을 통한 다형성

앞서 상속에서 본 것처럼, 자식 클래스는 부모 클래스의 메서드를 오버라이딩(재정의)하여 자신만의 기능을 구현할 수 있습니다.

class Shape:
    def area(self):
        pass  # 추상적인 개념이므로 구현하지 않음
    
    def describe(self):
        return f"이것은 도형입니다. 면적: {self.area()}"

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        import math
        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.describe())  # 같은 메서드 호출이지만 각 객체 타입에 맞게 실행됨

3. 덕 타이핑(Duck Typing)

파이썬은 "덕 타이핑"이라는 개념을 따릅니다. "오리처럼 걷고, 오리처럼 꽥꽥거리면, 그것은 오리일 것이다"라는 말에서 유래했습니다. 즉, 객체의 타입보다는 객체가 어떤 메서드와 속성을 가지고 있는지가 중요합니다.

class Duck:
    def sound(self):
        return "꽥꽥"
    
    def walk(self):
        return "뒤뚱뒤뚱 걷기"

class Person:
    def sound(self):
        return "안녕하세요"
    
    def walk(self):
        return "두 발로 걷기"

class Dog:
    def sound(self):
        return "멍멍"
    
    def walk(self):
        return "네 발로 걷기"

# 덕 타이핑을 활용한 함수
def make_sound_and_walk(entity):
    # 타입을 검사하지 않고, 필요한 메서드가 있는지만 확인
    return f"소리: {entity.sound()}, 걸음걸이: {entity.walk()}"

# 서로 다른 클래스의 인스턴스를 동일한 방식으로 처리
duck = Duck()
person = Person()
dog = Dog()

print(make_sound_and_walk(duck))
print(make_sound_and_walk(person))
print(make_sound_and_walk(dog))