1. 오버로딩(OverLoading)이란?
메서드는 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 합니다.
그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도
매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있습니다.
이것을 오버로딩(OverLoading)이라고 합니다.
2. 오버로딩(OverLoading)의 조건
- 메서드 이름이 같아야 합니다.
- 매개변수의 개수 또는 타입이 달라야 합니다.
- 변환타입은 영향이 없습니다.
3. 예시
3 - 1. 대표적인 예시 "println"
가장 대표적인 예시로 println 메서드가 있습니다.
println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라집니다.
PrintStream클래스에는 어떤 종류의 매개변수를 지정해도 출력할 수 있도록
아래와 같이 10개의 오버로딩된 println메서드를 정의해놓고 있습니다.
- void println()
- void println(boolean x)
- void println(char x)
- void println(char [] x)
- void println(double x)
- void println(float x)
- void println(int x)
- void println(long x)
- void println(Object x)
- void println(String x)
println메서드를 호출할 때 매개변수로 넘겨주는 값의 타입에 따라서 위의 오버로딩된 메서드들 중의 하나가 선택되어 실행되는 것입니다.
3 - 2. 프로젝트 중 예시
대다수의 프로젝트를 진행할 때 회원 도메인이 있으며, 회원을 찾는 메서드가 존재할 것입니다.
회원을 찾을 때 가입된 이메일로 찾을 수도 있고, 등록된 index로 찾을 수도 있습니다.
여기서 오버로딩을 이용하면 findMember 라는 하나의 메서드이름으로 두 가지를 수행할 수 있습니다.
public Member findMember(String username) {
return memberRepository.findByUsername(username)
.orElseThrow(() -> new IllegalArgumentException(username + "은(는) 없는 회원입니다"));
}
public Member findMember(long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("없는 회원입니다"));
}
4. 장점
메서드가 단지 이름만으로 구별된다면, 한 클래스내의 모든 메서드들은 이름이 달라야합니다.
모두 근본적으로는 같은 기능을 하는 메서드들이지만, 서로 다른 이름을 가져야 하기 때문에 이름을 짓기 어렵고, 이름을 일일이 구분해서 기억해야 하기 때문에 힘듭니다.
하지만 오버로딩을 통해 여러 메서드들이 println이라는 하나의 이름으로 정의될 수 있다면, 사용하기 매우 편해집니다.
또한 메서드들의 이름이 같으니, 같은 기능을 하겠구나 하고 쉽게 분류가 가능합니다.
5. 가변인자와 오버로딩
기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며,
이 기능을 가변인자(variable arguments) 라고 합니다.
여기서 가변인자는 항상 마지막 매개변수이어야 합니다.
public PrintStream printf(String format, Object... args) {}