Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python은 다형성(Polymorphism)을 지원할까? 핵심 개념과 예제 총정리

Python은 다형성을 지원합니다

네, Python은 다형성(Polymorphism)을 지원합니다.

다형성이라는 단어는 그리스어로 '많은 형태(many forms)'를 의미하며, 하나의 객체나 메서드가 상황에 따라 여러 가지 방식으로 동작할 수 있는 능력을 뜻합니다.

다형성은 Python 클래스 정의에서 매우 중요한 특징으로, 서로 다른 클래스나 하위 클래스에 동일한 이름의 메서드가 존재할 때 활용됩니다. 덕분에 호출부는 객체의 실제 타입을 신경 쓰지 않고도 같은 인터페이스로 다양한 객체를 다룰 수 있습니다.

다형성은 주로 상속(Inheritance)을 통해 구현되며, 하위 클래스는 부모(기반) 클래스의 메서드를 그대로 사용하거나 필요에 따라 재정의(오버라이딩)하여 자신만의 동작을 정의할 수 있습니다.

다형성의 두 가지 유형

  • 오버로딩(Overloading)
  • 오버라이딩(Overriding)

1. 오버로딩(Overloading)

오버로딩은 하나의 클래스 안에 메서드 이름은 같지만 매개변수가 서로 다른 두 개 이상의 메서드가 존재하는 경우를 말합니다.

참고로 Python은 Java나 C++처럼 전통적인 메서드 오버로딩 문법을 직접 제공하지는 않습니다. 대신 기본 인자(default arguments), *args / **kwargs 등을 활용해 유사한 효과를 얻을 수 있습니다.

2. 오버라이딩(Overriding)

오버라이딩은 메서드 이름과 매개변수(즉, 메서드 시그니처)가 완전히 동일한 두 개의 메서드가 있을 때 발생합니다. 하나는 부모 클래스에, 다른 하나는 자식 클래스에 정의되며, 자식 클래스의 메서드가 부모 클래스의 메서드를 대체하여 실행됩니다.

예제 코드

아래 예제에서는 Fish 클래스와 Clownfish 클래스가 각각 같은 이름의 메서드(skeleton)를 가지고 있습니다. 각 객체는 자신에게 정의된 메서드를 호출하여 서로 다른 결과를 출력합니다.

class Fish():
    def swim(self):
        print("The Fish is swimming.")

    def swim_backwards(self):
        print("The Fish can swim backwards, but can sink backwards.")

    def skeleton(self):
        print("The fish's skeleton is made of cartilage.")

class Clownfish():
    def swim(self):
        print("The clownfish is swimming.")

    def swim_backwards(self):
        print("The clownfish can swim backwards.")

    def skeleton(self):
        print("The clownfish's skeleton is made of bone.")

a = Fish()
a.skeleton()
b = Clownfish()
b.skeleton()

실행 결과

python polymorphism.py 명령으로 프로그램을 실행하면 아래와 같은 출력을 확인할 수 있습니다.

The fish's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.

같은 skeleton() 메서드를 호출했음에도 불구하고, 각 객체의 실제 클래스에 정의된 내용이 실행되는 것을 볼 수 있습니다. 이것이 바로 Python에서 다형성이 동작하는 방식입니다.