이번 포스팅에서는 메소드 오버로딩(Method Overloading)에 관하여 가볍게 알아보겠습니다.
오버로딩(Overloading)이란?
변수 선언시 변수 명이 중복되지 않게 선언한 것처럼 메소드도 마찬가지로 서로 구별될 수 있어야 합니다.
하지만 자바에서는 한 클래스 내에 이름이 같은 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 사용할 수 있습니다. 이처럼 한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것을 메소드 오버로딩(Method Overloading)이라 부르며 간단하게는 오버로딩(Overloading)이라 부릅니다. 코드로 바로 확인해보겠습니다.
1
2
int apple;
int apple;
만약 위 코드처럼 apple이라는 이름을 가진 변수를 두 번 선언하면 오류가 발생합니다. 하지만 메소드는
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package smile;
publicclass Test {
publicstaticvoid main(String[] args) {
Test t =new Test();
t.something();
t.something(10);
t.something(10,10);
t.something(10,10.1);
}
void something() {
System.out.println("something!");
}
void something(int i) {
System.out.println(i);
}
void something(int i, int i2) {
System.out.println(i+i2);
}
void something(int i, double d) {
System.out.println(i+d);
}
}
Colored by Color Scripter
이와 같이 Test클래스 내부에 something()이라는 이름을 가진 메소드가 4개가 있지만 매개변수가 각각 다르므로 사용이 가능합니다.
오버로딩의 조건
1. 메소드의 이름이 같아야합니다.
- 위 코드보시면 이름이 같은 something()이라는 메소드가 4개가 있지만 사용이 가능하죠?
2. 매개변수의 개수 또는 타입이 달라야 합니다.
- 매개변수가 없는 메소드부터 1개, 2개가 있는 메소드가 있으며 개수가 같더라도 세 번째 something() 메소드는 두 개의 int형 타입이고 마지막 네 번째 something() 메소드는 int형과 double형이기 때문에 오버로딩이 가능합니다.
3. 매개변수의 개수와 타입은 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않습니다.
- 메소드를 호출하는 부분에서는 호출 할 메소드의 이름과 매개변수 개수, 타입으로 구분짓기 때문에 return타입이 다르다고 해서 오버로딩이 성립되지는 않습니다.
그러면 오버로딩은 왜 사용할까?
오버로딩이 없을 경우 두 개의 매개변수를 받아서 정수+정수/ 정수+실수 / 실수+실수를 덧셈하는 add()메소드를 다음과 같이 정의해야합니다.
1
2
3
4
5
6
7
8
9
int addInteger(int first, int second){
return first+second;
}
double addIntDouble(int first, double second){
return first+second;
}
double addDouble(double first, double second){
return first+second;
}
Colored by Color Scripter
위 코드를 작성하는데 너무 귀찮았습니다. 가장 귀찮았던 이유는 모두 덧셈하는 기능이지만 타입이 다르다는 이유로 메소드의 이름을 짓기가 어려웠습니다. 다음은 오버로딩을 사용한 코드입니다.
1
2
3
4
5
6
7
8
9
intadd(int first, int second){
return first+second;
}
doubleadd(int first, double second){
return first+second;
}
doubleadd(double first, double second){
return first+second;
}
Colored by Color Scripter
매개변수가 다르지만 add라는 메소드의 이름이 중복되도 괜찮기 때문에 각 각 메소드의 이름을 짓는 번거로움에서 벗어날 수도 있고 add라는 메소드 이름 하나만 기억하면 되므로 부담이 덜 된다는 장점이 있습니다.