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에서 다형성이 동작하는 방식입니다.