3-5. Method Overloading

uoayop·2021년 3월 21일
0

Leaf와 Python

목록 보기
14/21
post-thumbnail

Overriding 이 부모 클래스와 관련이 있다면, Overloading은 메소드끼리의 관련이 있다. (파라미터 관련)

Method Overloading

  • 오늘의 키워드
    • 동일 메소드 재정의
    • 네이밍으로 기능 예측
    • 코드 절약, 가독성 향상
    • 메소드 파라미터 기반 호출 방식

오버로딩 대체 왜 쓰는거죠? 🤔

1. 동일 메소드 재정의

2. 네이밍으로 기능 예측 가능

3. 코드 절약, 가독성 향상

4. ⭐️ 메소드 파라미터 기반 호출 방식

  • 오버라이딩과 가장 크게 다른 특징이다!
  • 파라미터 개수나 타입에 따라서 올바른 함수가 호출이 된다.

정적 타입과 동적 타입

  • 파이썬은 동적 타이핑 언어다. (managed 언어)
    하나의 변수가 타입에 구애받지 않는 데이터를 가리킬 수 있다.
    따라서 쉽고 간결하게 코딩을 할 수 있다는 장점이 있지만,
    타입 에러가 런타임에 실행될 때 발견된다는 단점이 있다.
a = 100
a = "String"
  • c나 메모리 포인터 같이 개발자가 직접 메모리 관리를 하는 언어는 정적 타이핑 언어다. (unmanaged 언어)
    컴파일 할때 타입이 잘못되었다면 경고나 에러로 알려준다.
    런타임 에러를 사전에 잡을 수 있게 해준다.

동일 이름 메소드 사용 예제

자료형에 따른 분기 처리를 해보자
datatype, args 를 입력 받아서 데이터 타입에 따라 처리해줬다.

class SampleB():
    def add(self, datatype, *args):
    	# 데이터 타입이 int이면 sum 함수
        if datatype =='int':
            return sum(args)
        # 데이터 타입이 str이면 join 함수    
        if datatype =='str':
            return ''.join(x for x in args)
    
b = SampleB()

# 숫자 연산
print('ex 2 > ',b.add('int',5,6))

# 문자열 연산
print('ex 2 > ',b.add('str','hello ','wolrd'))

클래스 내의 메소드 오버로딩 예제

  • 파라미터 개수에 따라 올바른 함수가 호출되도록 하고싶다.
    파라미터 개수가 두개일때도, 세개일때도 올바른 add 함수가 호출 되게끔 하려고 한다.
class SampleA():
    def add(self,x,y):
        print('파라미터가 두개인 add 호출')
        return x+y
    
    def add(self,x,y,z):
        print('파라미터가 세개인 add 호출')
        return x+y+z

a = SampleA()
print('ex 1 > ',a.add(2,3))
# error 발생
# TypeError: add() missing 1 required positional argument: 'z'
  • dir을 통해 객체 내부를 확인해보자
    더 나중에 선언된 파라미터가 세개인 함수 add 하나만 있는 것을 확인할 수 있다.
print('ex 1>', dir(a))
#  [ ... , 'add'] add 메소드가 하나이다.
  • a.add(2,3)를 호출하니 타입 에러가 발생했다.
    파이썬에서는 클래스 내에서 메소드 오버로딩을 지원하지 않기 때문이다.

  • 클래스 내 메소드 오버로딩을 지원하게 만드는 것이 multiple dispatch이다.


dispatch annotation 사용하기

multipledispatch 패키지를 통한 메소드 오버로딩을 해보자

$pip install multipledispatch

패키지를 먼저 설치해주고, import 해주자

from multipledispatch import dispatch
class SampleC():
    @dispatch(int,int)
    def product(x, y):
        return x * y
    
    @dispatch(int,int,int)
    def product(x, y ,z):
        return x * y * z

    @dispatch(float,float)
    def product(x, y):
        return x * y

c = SampleC()

# 정수 파라미터 두개
print('ex 3 > ',c.product(2, 3))
# 정수 파라미터 세개
print('ex 3 > ',c.product(2, 3, 4))
# 실수 파라미터 두개
print('ex 3 > ',c.product(2.0, 3.0))

2번 예제에서 보았듯이 파이썬에선 클래스 내의 메소드 오버로딩을 지원하지 않는다.
그렇지만 multipledispatch 패키지를 통해 해당 기능을 사용할 수 있게 됐다.

  • 사용하려는 메소드 위에 @dispatch(자료형) 을 붙여서 사용한다.
  • 현업에서도 사용한다고 하니 기억해두자.

[ 출처 ]

  1. 인프런 - 모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)

  2. Python 3 정적 타이핑 소개 및 소감

profile
slow and steady wins the race 🐢

0개의 댓글