p283
오버로딩이란?
메소드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기에 각기 다른 이름을 가져야 한다. 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개 변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것을 오버로딩이라 한다. 하나의 메소드 이름으로 여러 기능을 구현한다.
오버로딩의 조건
같은 이름의 메소드를 정의한다고 해서 무조건 오버로딩은 아니다.
1. 메소드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
오버로딩된 메소드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 영향을 주지 못한다.
오버로딩의 예
println이 오버로딩의 대표적인 예다. 실제로 println 메소드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println 메소드가 달라진다.
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)
println 메소드를 호출할 때 매개변수로 넘겨주는 값의 타입에 따라서 위의 오버로딩된 메소드들 중에 하나가 선택되어 실행된다.
int add(int a, int b)
{
return a+b;
}
int add(int x, int y)
{
return x+y;
}
위 두 메소드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에 오버로딩이 성립되지 않는다.
long add(int a, long b)
{
return a+b;
}
long add(long a, int b)
{
return a+b;
}
두 메소드 모두 int형과 long형 매개변수가 선언되었지만, 서로 순서가 다르다. 이 경우 호출 될 메소드가 구분될 수 있으므로 중복된 메소드 정의가 아닌, 오버로딩으로 간주한다.
이처럼 단지 매개변수의 순서를 다르게 하여 오버로딩을 구현하면, 사용자가 매개변수 순서를 외우지 않아도 되는 장점이 있지만, 단점도 될 수 있기에 주의해야 한다.
int add(int a, int b)
long add(long a, long b)
long add(int[] a)
위 메소드들은 모두 바르게 오버로딩 되어 있다. 정의된 매개변수가 서로 다르긴 해도, 세 메소드 모두 매개변수로 넘겨 받은 값을 더해서 그 결과로 돌려주는 일을 한다.
같은 일을 하지만 매개 변수를 달리해야하는 경우에, 이와 같이 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현한다.
오버로딩의 장점
오버로딩으로 여러 메소드들이 println이라는 하나의 이름으로 정의될 수 있다면, println이만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있다. 또, 메소드 이름만 보고드 '이 메소드들은 이름이 같으니, 같은 기능을 하겠구나' 고 예측할 수 있다.
하나의 이름으로 여러 개 메소드를 정의할 수 있으니 메소드 이름을 짓는데 고민을 덜 수 있다.
'Java > 정석' 카테고리의 다른 글
static, instance 메소드 (0) | 2022.05.29 |
---|---|
배열 (0) | 2022.05.29 |
기본형 매개변수, 참조형 매개변수 (0) | 2022.05.27 |
생성자 (0) | 2022.05.26 |
객체 지향 (1) | 2022.05.24 |