프로그래밍자바 개발자

자바에서 메서드 오버로딩(Overloading)이란 무엇이며, 어떻게 구현되는지, 사용 시 어떤 주의사항이 있는가?

Hintsage AI 어시스턴트로 면접 통과

답변

메서드 오버로딩(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; } }

주의사항:

  • 자바는 시그니처(이름 + 매개변수 목록)에 따라 메서드를 구별합니다; 반환 유형은 오버로딩에 영향을 미치지 않습니다.
  • 기본 유형의 매서드 오버로딩 시 암시적 변환(widening)이 가능하므로, 호출의 모호성을 초래할 수 있습니다.
  • 오버로딩된 메서드에서 varargs 사용 시 주의해야 하며, 원하지 않는 결과를 초래할 수 있습니다.

헷갈릴 수 있는 질문

질문: 매개변수를 변경하지 않고 반환 유형만으로 메서드를 오버로딩할 수 있는가?

답변: 아닙니다. 오버로딩은 매개변수 목록이 다를 때만 가능합니다. 반환 유형만 다르게 설정할 경우 컴파일 오류가 발생합니다.

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로 변환될 수 없기 때문입니다!