한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '오버로딩'이라고 한다.
!! 반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다!!
[보기 1]
int add(int a, int b) {return a+b;}
int add(int x, int y) {return x+y;}
//매개변수의 이름만 다를 뿐 타입이 같이 때문에 성립x
//사용되는 변수의 이름이 달라질 뿐, 아무런 의미 없음. 그냥 같은 메서드임
[보기2]
int add(int a, int b) {return a+b;}
long add(int a, int b) {return (long)(a+b);}
//리턴타입만 다른 경우. 매개변수의 타입과 개수가 일치하기 때문에
//어떤 메서드가 호출될지 모름. 오버로딩x
[보기3]
long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}
//매개변수 값에 의해 호출될 메서드가 구분될 수 있으므로 오버로딩 o
// but, 순서만 바꿔놓은 것은 단점이 될 수 있기에 주의해야함.
[보기4]
int add(int a, int b) {return a+b;}
int 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;
}
//모두 올바르게 오버로딩 되어 있다.
//같은 일을 하지만 매개변수를 달리해야하는 경우에,
//이와 같이 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현 한다.
가변인자는 '타입... 변수명'과 같은 형식으로 선언하며, PrintStream클래스의 printf()가 대표적인 예.
가변인자는 매개변수 중에서 가장 마지막에 선언해야한다. 구별할 방법이 없기 때문이다.
//만일 여러 문자열을 하나로 결합하여 반환하는 concatenate메서드를 작성한다면
//아래와 같이 매개변수의 개수를 다르게 해서 여러 개의 메서드를 작성해야할 것이다.
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}
//이럴 때 가변인자를 사용하면
String concatenate(String... str){...}
//이 메서드를 호출할 때는 인자의 개수를 가변적으로 할 수 있다.
System.out.println(concatenate()); //인자가 없어도 되고
System.out.println(concatenate("a")); //인자 하나
System.out.println(concatenate("a","b")); //인자 둘
System.out.println(concatenate(new String[]{"A","B")); //배열도 쌉가능!
//가변인자는 내부적으로 배열을 이용.
//메서드를 호출할 때마다 배열이 새로 생성. 편하지만 이런 비효율이 있음.
//매개변수의 타입을 배열로 할수도 있지만, 인자를 무적권 지정해 줘야하기 때문에, 인자 생략 불가.
//구별되지 못하는 경우가 잦기 때문에 ,가능한 가변인자를 사용한 오버로딩은 하지 않는 것이 좋다.