☕️ 오버로딩(Overloading)과 오버라이딩(Overriding)
이번 포스팅에서는 신입 면접 문제로 자주 등장하는 오버로딩과 오버라이딩에 대해서 포스팅해보려고 한다.
우선 오버로딩과 오버라이딩의 간략한 정의는 다음과 같다.
- 오버로딩
- 같은 이름의 메서드를 여러 개 정의하는 것 - 오버라이딩
- 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것
☕️ 오버로딩(Overloading)
앞서 오버로딩이란 같은 이름의 메서드를 여러 개 정의하는 것이라고 설명하였다.
자바의 한 클래스 내에서 sum()이라는 메서드를 이미 사용 중이라고 가정해 보자.
int sum(int num1, int num2) {
return num1 + num2;
}
자바에서는 이미 사용하려는 이름과 동일한 메서드가 있더라도, 매개변수의 개수 또는 타입이 다르다면 같은 이름의 메서드를 사용할 수 있으며 이를 오버로딩이라고 한다.
즉, 기능이 추가되어 int타입이 아닌 실수의 덧셈을 위한 메서드를 만들고자 한다면, 개발자는 메서드 이름을 고민할 필요 없이 동일하게 sum()으로 쓸 수 있으며 아래의 코드와 같이 구현을 할 수 있다.
int sum(int num1, int num2) {
return num1 + num2;
}
// 새로 추가된 sum() 메서드 - OverLoading이 적용되었다.
double sum(double num1, double num2) {
return num1 + num2;
}
단, 오버로딩이 가능한 조건은
- 매개변수의 개수가 달라야 한다.
- 매개변수의 타입이 달라야 한다.
이는 접근제어자 또는 리턴타입이 다르면 오버로딩이 되지 않아 컴파일 오류로 이어지게 된다.
☕️ 오버라이딩(Overriding)
오버라이딩이란 부모클래스로부터 상속받은 메서드의 내용을 변경(재정의)하여 사용하는 것이다.
상속받은 메서드를 그대로 사용할 수도 있지만, 필요에 따라 메서드를 재정의 하여 사용해야 하는 경우가 있다.
이와 같이 부모클래스로부터 상속받은 메서드를 재정의하여 사용하는 경우를 오버라이딩이라고 한다.
오버라이딩을 사용하지 않은 코드와 사용한 코드를 비교해 보자.
우선 오버라이딩을 사용하지 않은 코드의 경우, 실행결과는 '[부모클래스] name=choi'가 된다.
class ParentClass {
void sayName(String name) {
System.out.println("[부모클래스] name=" + name);
}
}
class ChildClass extends ParentClass {
}
public class OverridingTest {
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.sayName("choi"); // [부모클래스] name=choi
}
}
반면, 오버라이딩이 적용된 코드의 실행결과는 '[자식클래스] name=choi'가 된다.
class ParentClass {
void sayName(String name) {
System.out.println("[부모클래스] name=" + name);
}
}
class ChildClass extends ParentClass {
@Override
void sayName(String name) {
System.out.println("[자식클래스] name=" + name);
}
}
public class OverridingTest {
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.sayName("choi"); // [자식클래스] name=choi
}
}
두 번째 코드에서처럼 오버라이딩을 위해서는 부모클래스의 메서드와 리턴타입과 매개변수가 모두 일치해야 하며, @Override 어노테이션으로 명시를 할 수 있다.
번외로 위의 코드에서 @Override 어노테이션을 생략하더라도 오버라이딩된 메서드가 호출되는 것을 확인할 수 있을 것이다.
@Override을 생략해도 정상적인 실행결과를 얻을 수 있지만, @Override을 사용함으로써 가독성 얻고 안전장치를 걸어둘 수 있다.
@Override를 표시함으로써 이 메서드는 재정의된 메서드라는 것을 명시해 줌으로써 가독성을 높일 수 있다.
또 다른 측면에서는 만약 재정의하려는 메서드를 직접 타이핑하다가 오타가 났을 때, @Override을 명시했다면 컴파일 오류가 발생하여 사고를 미연에 방지할 수 있게 된다. 만약 @Override가 없는 상태에서 오타가 발생하였다면, 또 다른 메서드가 만들어지는 것이지 오류 상황은 아니므로 정상적으로 컴파일이 될 것이다. 하지만 의도하지 않은 개발로 인하여 장애를 초래할 것이다.
References.
1. 노빠꾸 개발일지 - [Java] 오버로딩 & 오버라이딩 차이 비교 정리(오버로딩, 오버라이딩 차이점)
2. 꿀잼모아 - 오버로딩(Overloading)과 오버라이딩(overriding) 차이
3. 컴공오리의_무드등 - JAVA_(Annotation) @Override는 왜 쓰는 걸까?
'Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크(Collection Framework) (0) | 2023.08.07 |
---|---|
[Java] 제네릭(Generic) (0) | 2023.08.05 |
[Java] 추상클래스와 인터페이스 비교 (0) | 2023.07.29 |
[Java] 인터페이스(Interface) (0) | 2023.07.27 |
[Java] 추상 클래스(Abstract Class) (0) | 2023.07.26 |