메소드 오버로딩 시그니처·장점·모호성
메소드 오버로딩(Method Overloading)은 같은 이름의 메소드를 매개변수만 다르게 선언해 다형성을 실현하는 핵심 문법입니다. 이 글에서는 오버로딩의 규칙부터 실무 팁, 모호성 해결법까지 예제 코드와 함께 자세히 알아봅니다.
메소드 오버로딩이란? (Definition)
- 같은 메소드 이름을 재사용해 입력 데이터별 로직을 분리하는 기술
- 시그니처(메소드 이름 + 매개변수 목록)가 다르면 컴파일러가 서로 다른 메소드로 인식
- 반환 타입은 오버로딩 조건에 포함되지 않습니다
오버로딩 규칙 (Rules & Signature)
반드시 달라져야 할 요소
- 매개변수 개수
- 매개변수 타입
- 매개변수 순서
반환 타입만 바꿔서는 컴파일 오류가 발생합니다.
왜 사용할까? (Benefits)
- 가독성 향상 – 동일 동작을 하나의 이름으로 통일
- 코드 재사용 – 입력 형태만 달라질 때 중복 코드 최소화
- 다형성 구현 – 호출부에서 자연스럽게 다양한 데이터 타입 처리
핵심 예제 모음 (Hands-on Examples)
1. 매개변수 개수가 다른 경우
class Calculator {
int add(int a, int b) { return a + b; }
int add(int a, int b, int c){ return a + b + c; }
}
2. 매개변수 타입이 다른 경우
class Calculator {
int multiply(int a, int b) { return a * b; }
double multiply(double a, double b) { return a * b; }
}
3. 매개변수 순서가 다른 경우
class Printer {
void print(String txt, int times){ … }
void print(int times, String txt){ … }
}
컴파일러는 어떻게 선택할까? (Resolution Process)
- 정확히 일치하는 시그니처 검색
- 없으면 자동 형 변환(implicit conversion) 적용
- 두 메소드가 모두 적합하면 모호성 오류 발생
모호성(ambiguity) 예제 및 해결
class Test {
void display(int a, double b){ … }
void display(double a, int b){ … }
}
new Test().display(10, 20); // ⚠ 컴파일 오류
해결 방법
- 명시적 형 변환:
display(10, 20.0);ordisplay(10.0, 20); - 시그니처가 겹치지 않도록 설계 수정
실무 팁 (Pro Tips)
- SRP(단일 책임 원칙) 유지: 한 메소드군이 동일 역할이어야 진정한 오버로딩
- 입력 매개변수가 많아진다면 Builder·DTO 패턴으로 가독성 확보
- 라이브러리 작성 시, 자주 쓰는 시그니처부터 간결하게 제
질문 정리
-
메소드 오버라이딩과 무엇이 다른가요?
오버로딩은 같은 클래스 내에서 매개변수를 달리해 정의, 오버라이딩은 상속 구조에서 부모 메소드를 재정의합니다.
-
반환 타입만 다른 메소드를 오버로딩할 수 있나요?
불가능합니다. 매개변수 목록이 같으면 시그니처가 동일하므로 컴파일러가 구분하지 못합니다.
-
가변인자(varargs)와 오버로딩을 함께 써도 되나요?
가능합니다. 단, 가변인자 메소드는 가장 마지막에 선언해 모호성을 줄이세요.
-
실무에서 오버로딩을 남발하면 안 되나요?
입력 형태가 명확히 구분되지 않으면 오히려 혼란을 초래합니다. 필요할 때만 적용하세요.
-
System.out.println()은 어떻게 동작하나요?
10여 개의 오버로딩된
println()메소드가 타입별로 준비돼, 컴파일러가 시그니처에 맞춰 자동 선택합니다.
댓글남기기