본문 바로가기
혼자 공부하는 것들/JAVA

가변인수는 신중하게!

by applepick 2022. 3. 16.
반응형

이펙티브 자바에서 읽었던 가변 인수에 대한 것을 정리해보았습니다.

가변 인수(varargs) 메서드는 명시한  타입의 인수를 0개 이상 받을수있습니다. 가변 인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 열을 만들고 인수들은 이 배열에 저장하여 가변 인수 메서드에 건네줍니다.

인수가 1개 이상이어야 할 때도 있습니다. 예를 들어 최솟값을 찾는 메서드인데 인수를 0개만 받을 수도 있도록 설계하는 것은 좋지 않습니다. 

static int min(int... args){
    if(args.length ==0){
        throw new IllegalStateException("인수가 1개 이상 필요합니다");
    }
    int min = args[0];
    for(int i=0;i<args.length;i++){
        if(args[i]<min){
            min = args[i];
        }
    }
    return min;
}

이 방식에는 몇 가지의 문제가 있습니다. 가장 심각한 문제는 인수를 0개만 넣어 호출하면(컴파일 x) 런타임에 실패합니다. 또한, 코드도 지저분하고, args 유효성 검사를 명시적으로 해야 하고, min의 초기값을 Integer.MAX_VALUE로 설정하지 않고는 for-each문도 사용할 수 없습니다. 이 코드를 한번 리팩터링 해보겠습니다.

위에 문제를 다음 코드처럼 매개변수를 2개 받도록 하면 됩니다. 즉, 첫 번째로 매개변수를 받고, 가변 인수는 두 번째로 받으면 앞의 문제를 해결할 수 있습니다.

static int min(int firstArg, int... remainingArgs){
    int min = firstArg;
    for(int arg : remainingArgs){
        if(arg<min){
            min = arg;
        }
    }
    return min;
}

위 예시처럼 가변인수는 인수 개수가 정해지지 않았을 경우 유용하게 사용할 수 있습니다. 하지만, 성능에 민감한 상황이라면 가변 인수가 걸림돌이 될수있습니다. 가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화합니다. 

 

정리

인수 개수가 일정하지 않은 메서드를 정의해야 한다면 가변 인수가 반드시 필요합니다. 메서드를 정의할 때 필수 매개변수는 가변인수 앞에 두고, 가변 인수를 사용할 때는 성능 문제까지 고려해야 합니다.

반응형

댓글