반환타입 메서드명(타입... 변수명)
타입... 은 내부적으로 배열로 처리된다. 즉, int... nums는 int[] nums와 동일하게 동작한다.
public class VarargsBasic {
static int sum(int... nums) {
int total = 0;
for (int n : nums) {
total += n;
}
return total;
}
public static void main(String[] args) {
System.out.println(sum()); // 인자 0개
System.out.println(sum(1, 2)); // 인자 2개
System.out.println(sum(1, 2, 3, 4, 5)); // 인자 5개
}
}
0
3
15
가변길이 매개변수는 반드시 마지막에 위치해야 한다.
public class VarargsMixed {
static void printInfo(String label, int... values) {
System.out.print(label + ": ");
for (int v : values) {
System.out.print(v + " ");
}
System.out.println();
}
public static void main(String[] args) {
printInfo("점수", 90, 85, 77);
printInfo("값없음"); // values는 빈 배열 {}
}
}
점수: 90 85 77
값없음:
int... nums는 내부적으로 int[]이므로, 배열을 직접 넘겨도 동작한다.
public class VarargsArray {
static double average(int... nums) {
if (nums.length == 0) return 0.0;
int sum = 0;
for (int n : nums) sum += n;
return (double) sum / nums.length;
}
public static void main(String[] args) {
System.out.println(average(10, 20, 30));
int[] arr = {4, 8, 12, 16};
System.out.println(average(arr)); // 배열 직접 전달 가능
}
}
20.0
10.0
public class VarargsString {
static String join(String separator, String... words) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < words.length; i++) {
sb.append(words[i]);
if (i < words.length - 1) sb.append(separator);
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(join(", ", "Java", "Python", "Go"));
System.out.println(join("-", "2025", "04", "08"));
System.out.println(join(" ", "Hello")); // 단어 1개
}
}
Java, Python, Go
2025-04-08
Hello
print(1, 2) 처럼 정확히 일치하는 고정 오버로딩이 있으면 JVM은 그쪽을 먼저 선택한다.
public class VarargsOverload {
static void print(int... nums) {
System.out.println("varargs: " + nums.length + "개");
}
static void print(int a, int b) {
System.out.println("고정: " + a + ", " + b);
}
public static void main(String[] args) {
print(1, 2); // 고정 매개변수가 우선 선택됨
print(1, 2, 3); // varargs 선택
print(); // varargs 선택
}
}
고정: 1, 2
varargs: 3개
varargs: 0개
| 항목 | 내용 |
|---|---|
| 내부 구현 | 배열(T[])로 처리됨 |
| 위치 제한 | 반드시 매개변수 목록의 마지막에 위치 |
| 개수 제한 | 메서드 당 1개만 허용 |
| 인자 0개 | 빈 배열(length == 0)로 전달됨, null 아님 |
| 배열 직접 전달 | 가능 (int[] arr → method(arr)) |
| 오버로딩 | 고정 매개변수 메서드가 우선 선택됨 |