본문 바로가기

Studying/Python

6. method overriding, method overloading(메소드 오버라이딩, 메소드 오버로딩)

1. method overriding(메소드 오버라이딩)

 

method overriding(메소드 오버라이딩)은 상위 클래스(부모 클래스, 슈퍼 클래스)를 상속받는

 

하위 클래스(자식 클래스, 서브 클래스)에서 재정의하여 사용하는 것을 의미힌다. 

 

부모 클래스의 메소드를 추상화, 재정의할 수 있고, 확장, 또는 다양한 방식으로 동작하도록 변주를 줘 구조적 접근이 가능하다.

 

쉽게 말하면, 상속받은 부모 클래스의 원래 기능을 유지하면서 자식 클래스에 새로운 기능을 덧붙일 때 사용한다.

 

method overriding 을 활용하면 가독성 증가, 오류 가능성 감소, 메소드 이름 절약, 유지 보수성 증가 등의 장점이 있다. 

 

method overriding 의 기본적인 방식은 아래와 같다. 

 

자식 클래스를 생성할 때, 부모클래스를 상속받도록 설정

자식 클래스인 c1에서 부모 클래스의 메소드 get_value를 호출했을 때 정상 작동하고, 부모 클래스의 변수 number 을 호출해도 오류가 나지 않는다. 

 

이번에는 자식 클래스에서 메소드 재정의 하는 예제를 살펴보자. 

 

위 예제를 보면, ParentEx2 클래스의 get_value 메소드와, ChildEx2의 get_value 메소드의 이름이 같지만

 

자식 클래스에서 이를 재정의했기 때문에 return 값이 다른 것을 확인할 수 있다. 

 

이렇게 재정의를 하면서 메소드를 효율적으로 사용하며 변주를 줄 수 있는 것이다. 

 

위 예제는 부모 클래스 하나를 상속받는 2개의 자식 클래스를 나타내고 있다. 

 

부모 클래스의 log 메소드를 각자 재정의하여 다형성적인 특징을 보이고 있다. 

 

뼈대는 부모클래스의 log 메소드, 자식 클래스1은 log를 시분초를 출력하는 메소드로,

 

자식 클래스2는 날짜를 출력하는메소드로 재정의 되었다. 

 

이 때도 같은 log라는 이름을 사용하면서 가독성을 높였고, 메소드 이름을 절약했다. 

 

자식 클래스에 포함되어 있는 super 함수는 상속 관계에서 상속의 대상인 부모 클래스를 호출하는 함수이다. 

 

인자는 ( 자식클래스 이름, 자식클래스 객체 ) 이렇게 2개를 받으며,

 

super( ).log(message)로 간단하게 작성해도 괜찮지만, 정확하게 무엇을 상속받는지 표시를 위해

 

super(TimeLogger, self).log(message)와 super(DateLogger, self).log(message)로 설정하였다. 

 


2. method overloading(메소드 오버로딩)

 

위에서 배운 method overriding이 부모 클래스와 관련이 있다면, method overloading는 메소드끼리 관련된 내용이다. 

 

method overloading은 동일 클래스 내에서, 매개변수의 갯수 또는 자료형이 다른 동명의 메소드를 정의하는 방법이다. 

 

즉, 클래스 내, 같은 이름의 메소드를 매개변수에 따라 기능하도록 여러 개 선언하는 것이다. 

 

위 예제를 보면 add 라는 동일 이름을 가진 메소드 2개가 정의된 것을 알 수 있다. 

 

a로 클래스를 할당한 후, 2개의 변수를 받는 메소드를 실행하면, 오류가 발생한다. 

 

(파이썬은 동적 타입 검사를 하기 떄문에, 실행 시에 타입 에러를 발견하게 된다.)

 

이는 파이썬 내부적으로 동일 이름일 경우, 가장 마지막으로 정의된 것만 인정하기 떄문이다. 

 

물론 위 오류는 변수를 아래처럼 packing 하여 해결 가능하다. 

 

def add(self, *args):
     return sum(args)

 

그렇다면, 만약 변수의 자료형에 따라 다른 결과를 내고 싶으면 어떻게 할까?

 

이는 if 문을 통해 구현할 수 있다.

 

위처럼 단순히 packing과 if 문을 사용하면, 변수의 갯수와 자료형에 따라 메소드를 다르게 사용할 수 있게 구현했다. 

 

위 방법도 편리하지만, 이 방식보다 좀더 간편하고 가독성을 높일 수 있는 방법으로 등장한 것이

 

multipleDispatch 패키지를 통한 method overloading 이다. 

 

이를 사용하려면 먼저 (가상환경에서) multipledispatch pip install 한 후, dispatch 데코레이터를 import 해야한다. 

 

이를 통해 각 상황에 맞게 @dispatch(자료형으로 구분)가 동명의 product 메소드에서 호출을 하고, 

 

이는 데이터 타입의 관점에서 메소드를 작성하여 구조성 있는 클래스를 생성할 수 있다는 장점이 있다. 

'Studying > Python' 카테고리의 다른 글

8. descriptor(디스크립터)  (0) 2022.03.03
7. meta class(메타 클래스)  (0) 2022.03.03
5. getter, setter, property  (0) 2022.02.27
4. 접근 지정자(Access Modifier)  (0) 2022.02.27
3. Context manager  (0) 2022.02.19