자바에서 **Overloading(오버로딩)**은 같은 이름의 메서드를 매개변수의 수, 타입, 순서를 다르게 하여 여러 개 정의하는 것을 의미합니다.
이는 컴파일 타임에 결정되는 정적 바인딩이며, 메서드 호출의 유연성과 편의성을 높이는 중요한 문법입니다.
하나의 클래스 안에서 동일한 이름의 메서드를 정의할 수 있도록 해주는 기능입니다.
**매개변수(parameter)**의 형태(개수, 타입, 순서)가 달라야 합니다.
반환값(return type)은 오버로딩의 조건이 되지 않습니다.
코드 가독성 향상
동일한 동작을 이름을 바꾸지 않고도 다양한 방식으로 처리 가능
유연한 메서드 제공
인자의 수나 타입에 따라 맞춤 처리를 쉽게 구현 가능
API 사용성 증가
개발자 입장에서 다양한 입력값을 쉽게 처리할 수 있도록 돕는 구조 제공
조건 항목 |
설명 |
---|---|
메서드 이름 |
같아야 함 |
매개변수 개수 |
다르거나 |
매개변수 타입 |
다르거나 |
매개변수 순서 |
다르면 오버로딩 성립 |
반환 타입 |
같거나 달라도 무관 (단, 반환 타입만 다르면 오버로딩 안 됨) |
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public String add(String a, String b) {
return a + b;
}
}
Calculator cal = new Calculator();
System.out.println(cal.add(1, 2)); // int형 → 3
System.out.println(cal.add(1.5, 2.5)); // double형 → 4.0
System.out.println(cal.add(1, 2, 3)); // 3개 int → 6
System.out.println(cal.add("Hello, ", "World")); // 문자열 → "Hello, World"
항목 |
오버로딩 (Overloading) |
오버라이딩 (Overriding) |
---|---|---|
적용 대상 |
같은 클래스 내부 |
상속 관계 (부모 → 자식 클래스) |
메서드 이름 |
같음 |
같음 |
매개변수 |
개수/타입/순서가 다름 |
동일해야 함 |
반환 타입 |
무관 |
동일 또는 하위 타입 |
접근 제어자 |
무관 |
부모보다 좁을 수 없음 |
바인딩 시점 |
컴파일 시 (정적 바인딩) |
실행 시 (동적 바인딩) |
오버로딩은 함수 시그니처(이름 + 매개변수) 기준으로 성립합니다.
즉, 반환 타입만 다르고 매개변수 구성이 같다면 컴파일 에러가 발생합니다.
// 오류 예시
public int print(String s) { return 1; }
public double print(String s) { return 2.0; } // 오류 발생: 반환 타입만 다름
자바에서는 생성자도 오버로딩할 수 있습니다.
public class Person {
String name;
int age;
public Person() {
this.name = "이름 없음";
this.age = 0;
}
public Person(String name) {
this.name = name;
this.age = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
자바의 오버로딩은 같은 기능을 다양한 형태로 제공하여 코드의 재사용성과 가독성을 높이는 데 매우 유용합니다.
라이브러리 설계, API 제작, 유틸리티 클래스 구현 시 자주 활용되므로, 다양한 사례를 직접 구현해보며 익히는 것이 좋습니다.