메서드 오버로딩(Method Overloading)은 동일한 이름의 메서드를 여러 개 만들되, 서로 다른 매개변수(유형, 순서, 개수)를 가지는 기능입니다. 이러한 접근법은 유사한 작업을 논리적으로 그룹화하고 코드의 가독성을 높이는 데 도움이 됩니다.
public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }
질문: 매개변수를 변경하지 않고 반환 유형만으로 메서드를 오버로딩할 수 있는가?
답변: 아닙니다. 오버로딩은 매개변수 목록이 다를 때만 가능합니다. 반환 유형만 다르게 설정할 경우 컴파일 오류가 발생합니다.
void foo(int a) {} int foo(int a) { return 1; } // 오류! 반환 유형은 오버로딩에 고려되지 않음.
이야기
한 프로젝트에서 개발자가 두 개의 메서드를 만들었습니다:
public void process(int x, double y) {...} public void process(double x, int y) {...}
process(5, 10)을 호출할 때, 컴파일러는 필요한 버전을 선택할 수 없으므로 호출 모호성 오류가 발생했습니다. 이로 인해 모듈 제출이 지연되었습니다.
이야기
애플리케이션에서 varargs 및 배열을 기반으로 한 오버로딩된 메서드:
public void log(String... messages) {...} public void log(String[] messages) {...}
String[] data배열을 전달할 경우 항상 예상된 오버로딩이 발생하지 않아 일부 정보가 잘못 기록되어 정보가 손실되었음을 나타냈습니다! 배열과 varargs 간의 차이가 치명적이었습니다.
이야기
개발자가 클래스의 메서드를 오버로딩하였으나 자동 박싱을 고려하지 않았습니다:
public void save(Integer i) {...} public void save(int i) {...}
save(null)을 호출할 때, primitive int에서 NullPointerException이 발생했습니다. 이는 자바가 가장 구체적인 유형(int)을 선택하지만, null은 primitive로 변환될 수 없기 때문입니다!