Python/파이썬 오픈소스 배포

메서드 오버로딩

monstro 2025. 7. 2. 01:13
728x90
반응형

- 개요

함수의 오버로딩로직은 동일하지만 함수의 인자의 개수인자의 타입이 다른 경우에 사용할 수 있다

하지만 파이썬런타임 시점에서 변수의 자료형을 결정하는 동적 타입 언어로서 

공식적인 방법으로는 함수 오버로딩 기능을 사용할 수 없다

 

하지만 파이썬에서도 함수 오버로딩을 구현할 수 있는 몇 가지 방법이 존재한다

각각 다음과 같이 표현할 수 있다

  • 패킹을 통한 함수의 인자를 객체화하여 함수 오버로딩 구현
  • 함수 내에서 자료형에 따른 분기를 통해 함수 오버로딩 구현
  • 외부 플러그인 multipledispatch을 사용하여 함수 오버로딩 구현

 

1) 패킹을 통한 함수 오버로딩 구현

class SampleA():
    # 패킹을 통해 오버로드를 수행
    def add(selfsel, *args):
        return sum(args)

a = SampleA()
print(f"add ver 01 {a.add(10, 20)}")
print(f"add ver 02 {a.add(10, 20, 30)}")
print(f"add ver 03 {a.add(1.05, 1.02, 1.03)}")

 

함수 add에서 * 연산자를 사용하여 함수의 인자를 패킹하여 하나의 인스턴스 합칠수 있다

위의 예시에서 2개의 정수 / 3개의 정수 / 3개의 실수를 인자로 add 함수를 수행한다

 

  

실행 결과는 위와 같다

각기 다른 인자에 대한 연산이 이뤄진 것을 확인할 수 있다

 

2) 자료형에 따른 분기로 함수 오버로딩 구현

class SampleB():
    def add(self, datatype, *args):
        if datatype == 'int':
            return sum(args)
        if datatype == 'str':
            return ''.join([word for word in args])

b = SampleB()

print(f"add ver 01 {b.add('str', "app", "ple")}")
print(f"add ver 02 {b.add('int', 20, 30)}")

 

함수 add에서 패킹한 인스턴스를 인자로 받는 부분은 동일하지만,

인자로 datatype을 추가하여 자료형에 따라 분기하여 로직이 동작한다

따라서 1)의 예시에서 처리하지 못하는 문자열도 처리할 수 있다

 

 

실행 결과는 위와 같다

정수말고 문자열도 문제없이 처리된 것을 볼 수 있다

 

3) multipledispatch 플러그인을 사용하여 함수 오버로딩 구현

from multipledispatch import dispatch

class SampleC():
    @dispatch(int, int)
    def add(self, x, y):
        return x + y

    @dispatch(int, int, int)
    def add(self, x, y, z):
        return x + y + z

    @dispatch(str, str, str)
    def add(self, w1, w2, w3):
        return w1 + w2 + w3
        
c = SampleC()
print(f"add ver 01 {c.add(10, 20)}")
print(f"add ver 02 {c.add(20, 30, 50)}")
print(f"add ver 03 {c.add("Hello,", "World ", "from Python")}")

 

외부 플러그인 multipledispatch로부터 dispatch를 임포트하고

함수에 @dispatch(인자1의 자료형, ...)의 형태로 어노테이션을 작성하면 함수 오버로딩을 구현할 수 있다

 

 

실행 결과는 위와 같다

2개의 정수 / 3개의 정수 / 3개의 문자열에 해당하는 인자를 사용해도

add 함수가 문제없이 동작하는 것을 확인할 수 있다

728x90
반응형

'Python > 파이썬 오픈소스 배포' 카테고리의 다른 글

메타 클래스 (2)  (0) 2025.07.05
메타 클래스 (1)  (0) 2025.07.04
메서드 오버라이딩  (0) 2025.07.01
Getter 메서드와 Setter 메서드  (0) 2025.07.01
언더스코어(_)의 사용  (0) 2025.06.30