메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야한다. 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading) 또는 오버로딩(overloading)
오버로딩의 조건
- 메서드 이름이 같아야한다.
- 매개변수의 개수 또는 타입이 달라야한다.
반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
오버로딩의 장점
package object_oriented_programming;
public class OverloadingTest {
public static void main(String[] args) {
MyMath3 mm =new MyMath3();
System.out.println("mm.add(3, 3) 결과 : "+mm.add(3,3));
System.out.println("mm.add(3L, 3) 결과 : " + mm.add(3L,3));
System.out.println("mm.add(3, 3L) 결과 : "+mm.add(3,3L));
System.out.println("mm.add(3L, 3L) 결과 : "+mm.add(3L,3L));
int[] a = {100,200,300};
System.out.println("mm.add(a) 결과 : "+mm.add(a));
}
}
class MyMath3{
int add(int a, int b) {
System.out.print("int add(int a, int b) - ");
return a+b;
}
long add(int a, long b) {
System.out.print("long add(int a, long b) - ");
return a+b;
}
long add(long a, int b) {
System.out.print("long add(long a, int b) - ");
return a+b;
}
long add(long a, long b) {
System.out.print("long add(long a, long b) - ");
return a+b;
}
int add(int[] a) {
System.out.print("int add(int[] a) - ");
int result = 0;
for(int i=0; i<a.length; i++) {
result += a[i];
}
return result;
}
}
//결과
int add(int a, int b) - mm.add(3, 3) 결과 : 6
long add(long a, int b) - mm.add(3L, 3) 결과 : 6
long add(int a, long b) - mm.add(3, 3L) 결과 : 6
long add(long a, long b) - mm.add(3L, 3L) 결과 : 6
int add(int[] a) - mm.add(a) 결과 : 600
가변인자(varargs)와 오버로딩
가변인자 : 타입... 변수명
package object_oriented_programming;
public class VarArgsEx {
public static void main(String[] args) {
String[] strArr = {"100","200","300"};
System.out.println(concatenate("","100","200","300"));
System.out.println(concatenate("-",strArr));
System.out.println(concatenate(",",new String[] {"1","2","3"}));
System.out.println("["+concatenate(",",new String[0]+"]"));
System.out.println("["+concatenate(",")+"]");
}
static String concatenate(String delim, String ... args) {
String result = "";
for(String str : args) {
result+=str+delim;
}
return result;
}
}
//결과
100200300
100-200-300-
1,2,3,
[[Ljava.lang.String;@1877ab81],
[]
concatenate메서드는 매개변수로 입력된 문자열에 구분자를 사이에 포함시켜 결합해서 반환한다.
가변인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야한다. 가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.
출처 : JAVA의 정석 - (남궁성지음)