[Java] Overloading VS Overriding

김상윤·2021년 11월 30일
0

목표

Java에서 overriding과 overloading의 차이점은 각종 기술면접에서 단골문제로 자리매김을 하여왔다.

그럼에도 불구하고, 아직도 해당 두 기능에 대하여, 혼동하는 경우가 잦아 포스팅을 하여 정리하고자 한다.

사전적의미

Overloading

Overload의 사전적의미는, over + load로 나누어서 이해하면 쉽다.
즉 초과(over)적재(load)를 의미한다.

그렇다면 왜 Overloading이라는 용어가 사용되는 것일까?

하나의 이름으로 정의된 메소드가 하나의 기능을 처리하는것이 아닌 여러 기능을 초과하게 수행한다고 하여서, Overloading이라는 이름이 붙은 것이 아닐까 필자는 추측해본다.

Overriding

Overriding은 구글 번역기 기준으로 '우선'으로 번역이 된다. 그러나, 이는 우리가 의도한 의미가 아닐것이라 판단된다.

따라서, 필자는 over(위에) + riding(올라탄다)로 구분하여, 위에 덮어서 올라탄다는 의미로 해석하는것이 가장 적절하다고 판단된다.

Overloading

overloading에 대해서 본격적으로 알아보자.

예를 들어, 값을 비교하는 프로그램을 작성한다고 해보자.

그리고 당신은, 표준입력으로 들어온 2개의 값을 비교하는 함수를 작성을 하였다고 가정해보자.

그러나, 후에 이를 확장하여, 3개의 값을 비교해야하는 경우에는 어떻게 해야할까?

보통의 경우에는 3개의 값 비교 전용의 함수를 새로 생성할 것이다. 이것은 잘 작동할 것이다.

그러나, 인자의 개수에 따라서, 함수명을 바꿔서 새로 정의하는 방식의 코딩은 깔끔하다고는 생각이 들지 못할것이다.

이에 대한 솔루션이 바로 Overloading이다.
즉, Overloading을 이용하면, 매개변수의 개수에 따라, 이름을 재사용할 수 있게 된다.

정리하자면,
Overloading은 자바의 동일한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수와 타입이 동일하지 않다면, 같은 이름을 사용해서 메소드를 정의할 수 있다는 것이다.

그러나 Overloading에는 제약이 존재한다.

바로, 메소드의 이름은 같아야하고, 매개변수의 개수와 타입이 달라야 한다는 것이다.
만약 매개변수가 모두 같고, 리턴타입만 다른 경우에는 error가 발생하게 된다.

Overriding

Overriding을 이해하기 앞서서 가장먼저 이해해야 할 것은 바로 '상속'이다.

'상속'이란 흔히 우리가 말하는, '부모가 자식에게 재산을 상속하다'의 상속과 동일한 의미이다.

마찬가지로 Java에서도 부모 클래스가 자식 클래스에게 기능을 '상속'시켜줄 수 있다.

그렇다면, 자식 클래스는 이 상속받은 기능을 그대로만 사용해야 할까?
아니다. 이를 가능케해주는 것이, Overriding이다.

즉, 정리하자면, Overriding은 부모로 부터 상속받은 기능을 재정의 하는것 이라고 보면 된다.

Overloading과 마찬가지로 Overriding에도 제약이 있다.

자식 클래스가 부모 클래스의 메소드를 Overriding하기 위해서는 아래와 같은 규칙을 적용시켜야 한다.
1. 메소드의 이름
2. 메소드 매개변수의 숫자와 데이터 타입 그리고 순서
3. 메소드의 리턴 타입

결과적으로, 부모 클래스의 메소드를 Overriding하는 것은 부모에게서 상속받은 기능의 내용만을 새로 정의하는 것이므로 선언부는 부모의 것과 완벽히 동일해야 하는 것을 볼 수 있다.

Reference

https://hyoje420.tistory.com/14
https://www.opentutorials.org/course/1223/6090

profile
알고리즘을 아직도 모르겠다

0개의 댓글