아래의 내용은 java_grammer 레파지토리 C02MethodClass 디렉터리에 저장되어있는 내용을 정리하였다.
같은 이름의 메서드를 여러 개 만들 수 있는 기능으로, 코드의 가독성과 사용성을 크게 향상시켜준다
핵심 규칙:
같은 이름의 메서드를 선언할 수 없다.
단, 매개변수의 개수 또는 타입이 다르면 허용된다.
// ❌ 불가능: 같은 이름 + 같은 매개변수
public static int sum(int a, int b) { }
public static int sum(int a, int b) { } // 컴파일 오류
// ✅ 가능: 매개변수 개수 다름
public static int sum(int a, int b) { }
public static int sum(int a, int b, int c) { }
// ✅ 가능: 매개변수 타입 다름
public static int sum(int a, int b) { }
public static int sum(double a, double b) { }
컴파일러는 호출 시 전달된 매개변수를 보고 가장 적합한 메서드를 자동 선택한다.
System.out.println(sum(10, 20)); // sum(int, int) 호출
System.out.println(sum(10, 20, 30)); // sum(int, int, int) 호출
System.out.println(sum(10.5, 20.5)); // sum(double, double) 호출
실행 결과:
30
60
31 // (10.5 + 20.5) = 31.0 → int 캐스팅
가장 친숙한 예시다.
System.out.println("hello"); // println(String)
System.out.println(10); // println(int)
System.out.println(10.5); // println(double)
println() 메서드는 수십 개의 오버로딩 버전이 존재한다.
List<Integer> myList = new ArrayList<>();
myList.add(10); // add(E e) - 요소 추가
myList.add(0, 20); // add(int index, E e) - 특정 위치에 추가
호출 시 컴파일러가 메서드를 선택하는 우선순위:
1. 정확히 일치하는 매개변수 타입 → 최고 우선
2. 자동 형변환 가능한 타입 (int → double)
3. 박싱/언박싱 (int → Integer)
4. 가변인자 (...)
sum(10, 20); // 1순위: sum(int, int)
sum(10.0, 20); // 2순위: sum(double, double) - int가 double로 자동변환
📍 오버로딩 (같은 클래스 내)
- 같은 메서드명
- 매개변수 다름
- 반환타입 상관없음
📍 오버라이딩 (상속 클래스 간)
- 같은 메서드명 + 매개변수
- 반환타입 일치
- 접근권한 ↑ 가능
public class Calculator {
// 기본 합계
public int sum(int a, int b) {
return a + b;
}
// 3개 합계
public int sum(int a, int b, int c) {
return a + b + c;
}
// 배열 합계
public int sum(int[] numbers) {
int total = 0;
for(int n : numbers) total += n;
return total;
}
// 사용
sum(1, 2); // 3
sum(1, 2, 3); // 6
sum(new int[]{1,2,3}); // 6
}
| 특징 | 설명 |
|---|---|
| 조건 | 같은 이름 + 다른 매개변수(개수/타입) |
| 장점 | 코드 가독성 ↑, 사용 편의성 ↑ |
| 실제 사례 | println(), add(), Math.max() 등 |
| 주의 | 반환타입만 다르면 오버로딩 불가 |
메서드 오버로딩은 자바 라이브러리 전반에 걸쳐 사용되는 핵심 기능이다.
println(), add(), format() 등 익숙한 메서드들이 모두 오버로딩으로 구현되어 있다.