Item 53. Varargs

가변인수는 신중히 사용하라

가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있고, 호출하게 되면 인수의 개수만큼 배열을 만들어서 인수들을 배열에 저장하여 메서드에 전달한다. 여기서 인수 1개 이상을 받아야만 하는 메서드는 가변인수만 사용하면 런타임 시점에 오류가 발생할 수 있다.

class Example {

    // 인수 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;
    }

    public static void main(String[] args) {
        System.out.println(min()); // 런타임 오류 발생
    }
}

위 예시에서는 인수가 1개 이상 필요한데 인수가 없는 상황에서 호출하게 되면 런타임 오류가 발생한다. 이를 방지하기 위해선 첫 번째 인수를 평번한 매개변수로 받도록 하면 된다.

class Example {

    // 인수 1개 이상을 받아야만 하는 메서드
    static int min(int firstArg, int... args) {
        int min = firstArg;
        for (int arg : args) {
            if (arg < min) {
                min = arg;
            }
        }
        return min;
    }
}

성능 문제

가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화하기 때문에 성능이 중요한 상황에서는 가변인수를 사용하지 않는 것이 좋다. 이러한 성능 문제를 최소화하기 위해선 일정 개수까지는 다중 정의를 활용하여 성능을 최적화할 수 있다.

class Example {

    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) {
    }
}

만약 대부분의 경우 인수가 3개 이하일 것으로 예상된다면 위와 같이 다중 정의를 활용하면 불필요하게 배열을 할당하고 초기화하는 비용을 줄일 수 있다.

Last updated

Was this helpful?