JDK 5에서 도입된 기능으로 메서드의 매개변수 개수를 클라이언트가 조절할 수 있게 해준다.
자바 라이브러리에서는 String.format()이 대표적인 예이다.
class Main {
public static void main(String[] args) {
System.out.println(sum(1, 2, 3, 4, 5));
}
private static int sum(int... args) {
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
}
컴파일러가 컴파일 타임에 배열을 만들고, 전달 된 인자들을 배열로 래핑하여 전달하는 방식으로 동작한다.
메서드 내부에서는 배열을 다루는 것과 완벽히 동일하게 동작한다.
주의사항
1. 마지막 인자로만 사용 가능
가변인수는 말 그대로 가변인수이기 때문에, 몇 개의 인자가 전달될지 모르는 상황이기 때문에, 마지막 인자로만 사용할 수 있다.
2. 오버로딩 주의
가변인수를 사용한 메서드와 동일한 시그니처를 가진 메서드를 오버로딩하면, 호출되는 메서드를 판단하기 모호해지고 컴파일 에러가 발생할 수 있다.
class Main {
public static void main(String[] args) {
System.out.println(sum(1, 2, 3, 4));
}
// origin
private static int sum(int... args) {
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
// 인자가 3개인 경우 호출되지만, 모호함이 발생
private static int sum(int a, int b, int c) {
return a + b + c;
}
// 컴파일 에러 발생, Ambiguous method call. Both
private static int sum(int a, int b, int... args) {
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum + a + b;
}
}