-
매개변수로 들어오는 값의 개수와 상관 없이 동적으로 인수를 받아 기능하도록 해주는 문법
-
ex) printf
public PrintStream printf(String format, Object ... args) { return format(format, args); }
static int sum(int... args) {
int sum = 0;
for (int arg : args)
sum += arg;
return sum;
}
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개만 넣어 호출하면 런타임에 실패한다.
- 코드가 지저분하다.
- args의 유효성 검사를 명시적으로 해야한다.
- min의 최소값을 Integer.MAX_VALUE로 설정하지 않고 for-each문을 사용할 수 없다.
static int min(int firstArgs, int... remainingArgs) {
int min = firstArg;
for (int arg : remainingArgs)
if (arg < min)
min = arg;
return min;
}
- 처음에 일반적인 매개변수를 받고, 가변인수를 두 번째로 받으면서 앞선 문제를 해결한다.
가변인수 메서드는 호출될 때마다 배열을 새로 할당하고 초기화한다.
→ 이 비용을 최소화하면서 가변인수의 유연성이 필요할 때 사용되는 패턴이 존재한다.
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) { }
- 해당 메서드 호출의 95%가 인수를 3개 이하로 사용한다고 가정하자.
- 인수가 0 ~3개인 것 까지 메서드를 각각 정의한다.
- 마지막 다중정의 메서드가 인수가 4개 이상인 5% 호출을 담당한다.
- ex) EnumSet