하나의 클래스 안에 같은 이름의 메소드를 여러 개 정의하는 것이 다. 메소드도 변수와 마찬가지로 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다. 그러나 Java에서는 매개변수의 개수나 타입이 다르면 같은 이름을 갖는 것을 허용한다. 즉, 이름이 같아도 다른 메소드로 간주하고 에러가 발생하지 않는다.
다음 조건을 만족해야 메소드 오버로딩으로 간주하여 에러가 발생하지 않는다.
오버로딩의 목적은 유사한 기능을 갖고 매개변수의 종류가 다른 메소드는 같은 이름으로 정의하여 메소드를 보다 편리하게 사용하기 위함이다. 가장 대표적인 예로 println()메소드가 있다. 어떤 타입의 매개변수를 전달해도 콘솔창에 출력하는 기능은 같다. 매개변수만 다르고 수행하는 기능은 똑같다.
PrintStream클래스의 println()메소드가 오버로딩 되어있다.
매개변수로 전달하는 값의 타입에 따라 아래 메소드들 중 하나가 실행된다.
println()
println(boolean x)
println(char x)
println(char[] x)
println(double x)
println(float x)
println(int x)
println(long x)
println(Object x)
println(String x)
public class OverloadingApp {
// 6개의 메소드 모두 이름은 같고 매개변수의 타입, 개수, 순서가 다르다.
// 따라서 오버로딩으로 간주되고 매개변수에 따라 한 개의 메소드가 호출된다.
int test(int x, int y) {
return x + y;
}
int test(int x) {
return x;
}
double test(double x, double y) {
return x + y;
}
double test(int x, int y, double z) {
return x + y + z;
}
long test(int x, long y) {
return x + y;
}
long test(long x, int y) {
return x + y;
}
}
주의할 점은 마지막 두 개의 메소드다. 두 메소드의 매개변수와 타입은 같지만 순서가 다르다. 이 경우도 물론 오버로딩으로 간주되지만, long타입 매개변수에 접미사를 붙여야 한다. 그렇지 않을 경우, 두 메소드 중 어느 메소드가 호출된 것인지 알 수 없어 에러가 발생하기 때문이다.
public class OverloadingApp {
// 매개변수의 이름만 다르고 타입과 개수는 같기 때문에 오버로딩으로 간주되지 않는다.
int test(int x, int y) {
return x + y;
}
int test(int a, int b) {
return a + b;
}
}
public class OverloadingApp {
// 반환타입만 다르고 매개변수의 타입과 개수는 같기 때문에 오버로딩으로 간주되지 않는다.
// test(3,3)을 실행했을 때, 어떤 메소드가 실행될지 결정할 수 없다.
int test(int x, int y) {
return x + y;
}
double test(int x, int y) {
return (double)(x + y);
}