: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
code EX
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;
}
다음과 같이 함수 이름은 "add"로 같지만 매개변수는 각각 다르다.
이처럼 함수 이름은 같고, 매개변수를 다르게 하는 기능을 오버로딩이라고 한다.
variable arguments : 기존의 메서드의 매개변수의 개수는 고정적이었지만, JDK1.5부터 동적으로 지정해 줄 수 있게 되었다. 이 기능을 가변인자(variable arguments)라고 한다.
선언법 : "타입... 변수명"과 같은 형식으로 선언한다.
EX) public PrintStream printf(String format, Object... args)
variable arguments말고도 매개변수가 더 있다면, variable arguments를 매개변수 중에 가장 마지막에 선언해야한다. 그렇지 않을 경우 컴파일 에러가 발생한다.
variable arguments의 기능
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... s) { ... }
concatenate();
concatenate("a");
concatenate("a", "b");
concatenate(new String[]{"a", "b"});
가변인자는 내부적으로 배열을 이용하는 것인데, 따라서 가변인자가 선언된 메서드를 호출할 때마다 새로운 배열이 생성된다.
가변인자를 선언하지 않고, 매개변수의 타입을 배열로 하는것을 보면....
String concatenate(String[] s { ... }
concatenate(); // 컴파일 에러
concatenate(null); // 인자로 null
concatenate(new String[0]); // 인자로 배열을 지정.
매개 변수 타입을 배열로 하면, 반드시 인자를 지정해줘야한다. 따라서 인자를 생략하면 컴파일 에러가 발생한다.
C언어와 다르게 자바에서는 길이가 0인 배열을 생성하는 것이 가능하다.
오버로딩의 주의점
가변인자가 있는 메서드를 오버로딩...
메서드를 호출했을 때, 구별되지 못하는 경우가 발생하기 쉽다. 따라서 가변인자를 사용한 메서드의 오버로딩을 피하는 것이 가장 좋다.