Java에서 메소드 오버로딩(Method Overloading)은 같은 이름의 메소드를 여러 형태로 정의하여 다양한 상황에 대응할 수 있게 해주는 강력한 기능입니다. 오버로딩된 메소드는 컴파일러가 전달되는 인자의 개수와 타입을 기준으로 자동으로 구분합니다.
메소드 오버로딩을 구현하는 3가지 방법
- 매개변수의 개수 변경 — 같은 타입이라도 매개변수의 개수를 다르게 하여 오버로딩할 수 있습니다.
- 매개변수 타입의 순서 변경 — 매개변수의 개수가 같더라도 타입이 배치되는 순서를 바꾸면 서로 다른 메소드로 인식됩니다.
- 매개변수의 데이터 타입 변경 — 매개변수의 데이터 타입 자체를 다르게 지정하여 오버로딩할 수 있습니다.
예제 코드
아래 예제에서는 하나의 클래스 안에 네 가지 버전의 add() 메소드를 정의하고, 각각 다른 방식으로 호출하는 모습을 보여줍니다.
public class Tester {
public static void main(String args[]) {
Tester tester = new Tester();
System.out.println(tester.add(1, 2)); // 매개변수 2개
System.out.println(tester.add(1, 2, 3)); // 매개변수 3개
System.out.println(tester.add(1.0f, 2, 3)); // float, int, int 순서
System.out.println(tester.add(1, 2.0f, 3)); // int, float, int 순서
}
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public float add(float a, int b, int c) {
return a + b + c;
}
public float add(int a, float b, int c) {
return a + b + c;
}
}실행 결과
3 6 6.0 6.0
결과 분석
add(1, 2)는 두 개의 int 매개변수를 받는 메소드가 호출되어 3을 반환합니다. add(1, 2, 3)은 세 개의 int 매개변수를 받는 버전이 선택되어 6을 출력합니다.
반면 add(1.0f, 2, 3)과 add(1, 2.0f, 3)은 float 타입이 포함된 시그니처에 매칭되므로 반환 타입이 float인 메소드가 실행되고, 결과값도 실수 형태인 6.0으로 출력됩니다. 이처럼 매개변수의 개수와 타입 조합만으로 컴파일러가 적절한 메소드를 정확히 찾아낸다는 점이 오버로딩의 핵심입니다.