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

파이썬 다형성(Polymorphism) 완전 정리: 연산자·내장 함수·클래스 메서드 활용법

다형성(Polymorphism)은 '여러 가지 형태'를 의미하는 개념입니다. 파이썬에서는 동일한 연산자나 함수가 입력값에 따라 서로 다른 방식으로 동작하는 모습을 쉽게 찾아볼 수 있습니다. 또한 이름이 같은 메서드를 여러 클래스에 정의하면 코드 재사용성이 높아지고 복잡도도 크게 줄어듭니다. 다형성은 상속(Inheritance)과도 밀접한 관련이 있으며, 아래 예제들을 통해 그 원리를 자세히 살펴보겠습니다.

1. 연산자(Operator)의 다형성

+ 연산자는 두 개의 입력을 받지만, 입력값의 타입에 따라 전혀 다른 결과를 반환합니다. 정수끼리 더하면 정수가 되고, 실수가 하나라도 포함되면 결과는 실수가 됩니다. 문자열의 경우에는 단순히 이어 붙여집니다(concatenation). 이런 동작이 가능한 이유는 파이썬의 + 연산자가 타입별로 다르게 구현되어 있기 때문입니다.

예제

a = 23
b = 11
c = 9.5
s1 = "Hello"
s2 = "There!"
print(a + b)
print(type(a + b))
print(b + c)
print(type(b + c))
print(s1 + s2)
print(type(s1 + s2))

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

34
<class 'int'>
20.5
<class 'float'>
HelloThere!
<class 'str'>

같은 + 연산자임에도 불구하고 정수 덧셈, 실수 덧셈, 문자열 결합이라는 세 가지 서로 다른 역할을 수행하는 것을 확인할 수 있습니다.

2. 내장 함수(Built-in Function)의 다형성

파이썬 내장 함수 역시 입력 타입에 따라 다르게 처리됩니다. 대표적인 예로 len() 함수를 들 수 있습니다. 문자열을 인자로 넘기면 글자 수를 세어주고, 튜플이나 딕셔너리를 넘기면 각각 요소의 개수를 계산해 반환합니다. 즉, 하나의 함수가 여러 데이터 타입에 맞게 유연하게 동작하는 것입니다.

예제

str_val = 'Hi There !'
tup = ('Mon','Tue','Wed','Thu','Fri')
lst = ['Jan','Feb','Mar','Apr']
dict_val = {'1D':'Line','2D':'Triangle','3D':'Sphere'}
print(len(str_val))
print(len(tup))
print(len(lst))
print(len(dict_val))

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

10
5
4
3

문자열은 공백 포함 10글자, 튜플은 5개 요소, 리스트는 4개 요소, 딕셔너리는 3개의 키를 기준으로 길이가 계산되었습니다.

3. 사용자 정의 메서드의 다형성

이름이 동일한 메서드를 서로 다른 클래스 안에 각각 정의할 수도 있습니다. 클래스 이름만 바꿔 호출하면 같은 메서드 이름으로도 전혀 다른 결과를 얻을 수 있습니다. 아래 예제에서는 사각형(Rectangle)과 원(Circle) 두 클래스가 둘레(perimeter)와 넓이(area)를 계산하는 동일한 이름의 메서드를 가지고 있습니다.

예제

from math import pi

class Rectangle:
    def __init__(self, length, breadth):
        self.l = length
        self.b = breadth
    def perimeter(self):
        return 2 * (self.l + self.b)
    def area(self):
        return self.l * self.b

class Circle:
    def __init__(self, radius):
        self.r = radius
    def perimeter(self):
        return 2 * pi * self.r
    def area(self):
        return pi * self.r ** 2

# 클래스 초기화
rec = Rectangle(5, 3)
cr = Circle(4)
print("사각형의 둘레:", rec.perimeter())
print("사각형의 넓이:", rec.area())

print("원의 둘레:", cr.perimeter())
print("원의 넓이:", cr.area())

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

사각형의 둘레: 16
사각형의 넓이: 15
원의 둘레: 25.132741228718345
원의 넓이: 50.26548245743669

마무리

이처럼 파이썬의 다형성은 연산자, 내장 함수, 사용자 정의 메서드 등 어디에서나 활용됩니다. 같은 이름의 인터페이스를 유지하면서 상황에 맞는 동작을 수행할 수 있기 때문에 코드의 일관성과 재사용성이 크게 향상됩니다. 나아가 상속과 함께 활용하면 오버라이딩(Overriding)을 통한 더욱 강력한 객체지향 설계도 가능해집니다.