6.4 메서드 오버로딩 (Method Overloading)
자바가 지원하는 강력한 객체 지향 성질 중 하나로, 한 클래스 내에서 "같은 이름을 가진 메서드를 여러 개 나란히 선언할 수 있도록" 허용하는 문법을 의미합니다.
1. 오버로딩의 정의와 조건
보통 한 클래스 내에서는 식별자가 유일해야 하므로 변수나 메서드 이름이 중첩되면 오류가 납니다. 하지만, 매개변수를 다르게 구성해주는 한, 이름이 같아도 전혀 다른 메서드로 분류 하여 인정해줍니다.
이것을 메서드 오버로딩이라고 하며, 만족해야 할 엄격한 조건은 다음과 같습니다.
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 그 외의 반환 타입 등은 아무런 영향을 주지 못합니다. (반환 타입만 다르다고 오버로딩이 되지 않음)
2. 오버로딩의 장점
대표적인 일례로 자바 콘솔 출력에 사용하는 System.out.println() 메서드는, 괄호 안에 숫자를 넣어도, 문자열, 심지어 논리값(true)을 넣어도 정상적으로 실행됩니다. 사실 이것이 println 메서드가 수십 개의 타입별 형식으로 오버로딩되어 구현되어 있기 때문입니다.
이를 통해 개발자는 함수의 이름을 외우는 데에 printlnInt(), printlnString() 등처럼 수고를 들일 필요 없이 직관적인 코딩이 가능합니다.
코드 예시
class MathHelper {
// 정수 2개를 더하는 메서드
int add(int a, int b) {
return a + b;
}
// 정수 3개를 더하는 메서드 (매개변수 개수가 다름)
int add(int a, int b, int c) {
return a + b + c;
}
// 실수 2개를 더하는 메서드 (매개변수 타입이 다름)
double add(double a, double b) {
return a + b;
}
// long 배열 모든 합을 반환하는 메서드
long add(long[] a) {
long result = 0;
for(long n : a) result += n;
return result;
}
}
위의 MathHelper 클래스는 add라는 동일한 메서드명 아래에 상황에 따라 다양하게 파라미터를 소화할 수 있는 강력한 재사용성을 지니게 됩니다. 이는 생성자(Constructor)에서도 오버로딩이 똑같이 성립하므로, Car(), Car(String c) 와 같이 다양하게 선언해둘 수 있습니다.