가변인수 메서드는 명시한 타입의 인수를 0 개 이상 받을 수 있다. 가변인수 메서드를 호출하면 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장해 가변인수 메서드에 건네준다.
예컨대 인수가 1개 이상이어야 할 때도 있다. 인수의 개수는 런타임에 배열의 길이로 알 수 있다. 다음 코드를 보자.
static int min(int... args){
if(args.length() == 0)
throw new IllegalArgumentException("인수가 1개 이상 필요합니다.");
int min = args[0];
for(int i = 1; i < args.length(); i++){
if(args[i] < min){
min = args[i];
}
}
return min;
}
이 방식에는 문제가 있다. 인수를 0개만 넣는 경우 컴파일 타임이 아니라 런타임에 오류를 판단할 수 있다는 점이다. 인수가 1개 이상이어야 할 때 제대로 사용하는 방법은 다음 코드와 같다.
static int min(int firstArg, int... remainingArgs){
int min = firstArg;
for(int arg: remainingArgs){
if(min > arg) min = arg;
}
return min;
}
가변인수 메서드는 호출될 때마다 배열을 생성하고 초기화한다. 성능에 민감한 경우라면 이 비용이 감당할 수 없을수 있다. 이 때 사용할 수 있는 멋진 패턴이 있다.
예를 들어 매개변수 메서드의 호출의 95% 가 인수를 3개 이하로 사용한다고 해보자. 그렇다면 0개부터 4개인 것까지, 총 5개를 정의하자. 마지막 다중정의 메서드가 인수 4개 이상인 5%의 호출을 담당하는 것이다.
public void foo(){}
public void foo(int a1){}
public void foo(int a1, int a2){}
public void foo(int a1, int a2, int a3){}
public void foo(int a1, int a2, int a3, int... rest){}