Python OOP 다형성: 오리 유형 지정 및 인터페이스

Python의 마스터 다형성. 덕 타이핑, 메서드 재정의 및 추상 기본 클래스를 사용하여 유연하고 느슨하게 결합된 코드를 작성하는 방법을 알아보세요.

에디터에서 사용해 보세요

개요

다형성은 "다양한 형태"를 의미하는 그리스어입니다. 객체 지향 프로그래밍에서는 서로 다른 클래스가 고유한 방식으로 동일한 메서드 호출에 응답하는 능력을 나타냅니다. 다형성을 사용하면 공통 인터페이스를 공유하는 다양한 유형의 객체를 처리할 수 있는 단일 함수를 작성할 수 있습니다. 이를 통해 결합도가 낮아지고 소프트웨어 시스템의 적응성이 뛰어나고 확장이 쉬워집니다.

Python에서 다형성은 Duck Typing이라는 개념과 깊이 연관되어 있습니다. 이 용어는 "오리처럼 걷고 오리처럼 꽥꽥거린다면 그것은 오리임에 틀림없다"라는 문구에서 유래되었습니다. 동적으로 유형이 지정된 Python에서 함수는 객체가 어떤 클래스에 속하는지 상관하지 않습니다. 해당 객체가 요청된 메서드를 구현하는지 여부에만 관심이 있습니다. 예를 들어 `.speak()`를 호출하는 함수가 있는 경우 이를 Dog, Cat 또는 Robot에 전달할 수 있습니다. 모두 `.speak()` 메서드가 있으면 코드가 완벽하게 실행됩니다.

더 엄격한 아키텍처를 위해 Python은 내장 `abc` 모듈을 통해 추상 기본 클래스(ABC)를 제공합니다. `abc.ABC`를 상속하고 `@abstractmethod` 데코레이터를 사용하면 하위 클래스가 강제로 구현해야 하는 공식 인터페이스를 정의할 수 있습니다. 자식 클래스가 추상 메서드를 정의하지 못하면 Python은 이를 인스턴스화하려고 할 때 TypeError를 발생시킵니다. 유연한 덕 타이핑과 공식적인 추상 클래스의 균형을 맞추는 것은 탄력적인 Python 라이브러리를 설계하기 위한 핵심 기술입니다.

코드 및 실행 출력

면적을 계산하는 모양을 나타내는 다형성 클래스를 구현합니다.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
터미널 출력
Calculated Area: 16.00
Calculated Area: 28.27

단계별 구현

  • CreditCard, PayPal 및 Stripe 객체를 처리하는 결제 프로세서 작성
  • 통합 렌더 루프를 사용하여 다양한 요소(텍스트, 이미지) 그리기
  • 단위 테스트 중 외부 API 연결 모의

자주 묻는 질문

오리 타이핑이란 무엇입니까?

이는 다형성에 대한 Python의 동적 접근 방식입니다. 특정 상위 클래스로부터의 상속을 확인하는 대신 런타임 시 메서드와 속성이 있는지 확인합니다.

추상 기본 클래스를 인스턴스화할 수 있나요?

아니요. ABC에서 상속되고 추상 메서드를 포함하는 클래스를 인스턴스화하려고 하면 TypeError가 발생합니다.

관련 주제

권장 Python 리소스

관련 대화형 튜토리얼, 치트 시트, 코드 비교를 통해 지식을 확장하세요.