[TIL] 자바 가변길이 매개변수 (Varargs)

revo·2026년 4월 8일

자바

목록 보기
17/30
post-thumbnail

기본 문법

반환타입 메서드명(타입... 변수명)

타입... 은 내부적으로 배열로 처리된다. 즉, int... numsint[] nums와 동일하게 동작한다.


예제 1 - 기본 사용

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

예제 2 - 일반 매개변수와 혼합

가변길이 매개변수는 반드시 마지막에 위치해야 한다.

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 
값없음: 

예제 3 - 배열과의 관계

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

예제 4 - String 타입 가변 인자

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

예제 5 - 오버로딩 주의사항

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[] arrmethod(arr))
오버로딩고정 매개변수 메서드가 우선 선택됨

0개의 댓글