오버로딩과 오버라이딩은 이름이 비슷해 자주 헷갈리는 개념이다. 간단하게 말하면 오버로딩(Overloading)은 같은 이름의 메소드 여러개를 가지면서 매개변수의 유형과 개수가 달라도 되도록 하는 기술이고, 오버라이딩(Overriding)은 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것을 뜻한다.
오버로딩(Overloading)
우선 오버로딩(Overloading)은 같은 메소드라도 매개변수만 다르면 얼마든지 정의하고 사용할 수 있다. 하지만 너무 많은 오버로드 함수를 가지고 있는 것은 혼란을 야기할 수 있으므로 과도하게 사용하는 것은 좋지 않다.
오버로딩의 특징은 아래와 같다.
- 메소드 이름이 같아야 함
- 리턴형이 같아도 되고 달라도 됨
- 파라미터 개수가 달라야 함
- 파라미터 개수가 같을 경우, 데이터타입이 달라야 함
아래는 python으로 오버로딩을 구현한 예제이다. 사실 python은 메소드 오버로드를 지원하지 않기 때문에 대체할 수 있는 방식으로 구현하였다.
class OverloadingNum:
def num(self, num1=None, num2=None):
if num1 is not None and num2 is None:
print("num2 =" + str(num2))
elif num1 is not None and num2 is not None:
print("num1 + num2 =" + str(num1 + num2))
else:
print("Do Something!")
obj = OverloadingNum()
obj.num(13, 21) # 34
obj.num(13) # 13
obj.num() # Do Something!
위와 같은 방식을 optional parameter라고 부른다. 파라미터에게 '기본값(defualt value)'을 설정해놓는 방식이다. 개인적으로 공식적으로 오버로딩을 지원하지 않는 언어인 python이나 dart를 이용해 개발할 때 optional parameter를 사용하는 것이 더 편하게 느껴진다.
이외에도 dictionary를 이용해 파라미터를 전달하거나 데코레이터를 사용하는 등 오버로딩을 구현할 방법은 많다.
오버라이딩(Overriding)
오버라이딩(Overriding)은 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 재정의하는 기술이다. 만약 자식클래스가 부모클래스에서 선언된 것과 같은 메소드를 가질 때, 메소드 오버라이딩이라고 한다. 특징은 아래와 같다.
- 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야 함
- 메소드 이름이 같아야 함
- 메소드 파라미터 개수, 파라미터의 자료형이 같아야 함
- 메소드 리턴형이 같아야 함
- 상위 메소드와 동일하거나 내용이 추가되어야 함
아래는 python으로 오버라이딩을 수행한 예제이다. 미리 정의되어있는 python의 매직 메소드를 재정의한 것이다.
class OverridingNum:
def __init__(self, num):
self.num = num
def __add__(self, num):
self.num = self.num + num * 2
def __sub__(self, num):
self.num = self.num - num - 10
obj = OverridingNum(40)
obj + 10
print(obj.num) # 60
obj - 10
print(obj.num) # 40
다만 여기서 피연산자의 자리를 바꾸어 10+obj로 사용하면 에러가 발생한다. 인스턴스 객체가 오른쪽으로 이동되어 있을 때는 __add__ 함수가 __radd__ 함수가 호출되기 때문이다. 재정의 할 때 이러한 요소들을 잘 고려해야 오류를 피할 수 있다.
다시 정리하자면 오버로딩(Overloading)은 기존에 없던 새로운 메소드를 정의하는 것이고, 오버라이딩(Overriding)은 상속 받은 메소드의 내용만 변경 하는 것(재정의)이다.
참고 자료
https://brunch.co.kr/@kimkm4726/2