오버로딩이란?
자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩(overloading)'이라 한다.
보통 하나의 메서드 이름에 하나의 기능만을 구현해야 하는데, 여러 기능을 구현하기 때문에 붙여진 이름이다.
오버로딩의 조건
- 메서드의 이름이 같아야 한다.
- 매개 변수의 개수 또는 타입이 달라야 한다.
위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다.
오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로
반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
int add(int a, int b) { return a + b; }
int add(int x, int y) { return x + y; }
매개 변수의 이름만 다를 뿐 매개 변수의 타입이 같기 때문에 오버로딩이 성립되지 않는다.
int add(int a, int b) { return a + b; }
int add(int a, int b) { return (long)(a + b); }
위 경우는 리턴 타입만 다른 경우이다. 매개 변수의 타입과 개수가 일치하기 때문에 add(3, 3)과 같이 호출하였을 때 어떤 메서드가 호출된 것인지 결정할 수 없기 때문에 오버로딩으로 간주할 수 없다.
int add(int a, int b) { return a + b; }
long add(long a, long b) { return a + b; }
long add(int[] a) {
long result = 0;
for (int i = 0; i < a.length;i++) {
result += a[i];
}
return result;
}
같은 일을 하지만 매개 변수를 달리해야 하는 경우에 이름이 같고 매개 변수를 다르게 하여 오버로딩을 구현한다.
오버로딩의 장점
만약 메서드도 변수처럼 단지 이름만으로 구별된다면, 한 클래스 내의 모든 메서드들은 이름이 달라야 한다.
예를 들면, prinln메서드들은 각기 다른 이름을 가져야 한다.
void println()
void printlnBoolean(boolean x)
void printlnChar(char x)
void printlnDouble(double x)
void printlnString(String x)
모두 근본적으로 같은 기능을 하는 메서드들이지만, 서로 다른 이름을 가져야 하기 때문에 메서드를 작성하는 쪽에서 이름을 짓기 어렵고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 된다.
하지만 오버로딩을 통해 여러 메서드들이 prinln이라는 하나의 이름으로 정의될 수 있다면, prinln이라는 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류가 일어날 가능성을 줄일 수 있다.
또 메서드의 이름을 절약할 수 있다는 것이다. 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있다.