가변인수는 사용 시 유의할 점

수박참외메론·2023년 3월 25일
0

가변인수(varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다.

static int sum(int... args) {
	int sum = 0;
    for (int arg : args)
    	sum += arg;
    return sum;
}

위의 함수에서는 입력받은 int 인수의 합을 반환한다.
위에서는 특별한 오류가 없겠지만, 인수가 하나 이상이어야 할 때에는 좀 코드가 더러워진다.

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;
}

위의 코드에는 몇가지 문제점이 있다.

  • 인수를 0개 넣어 호출하면 컴파일타임이 아닌 런타임에 오류가 발생한다.
  • args 유효성 검사도 하고, min 의 초기값도 설정해야한다.
  • 그래서 코드가 더러워진다.

하지만 가변인수를 사용할 때는 최소 인수를 아래같이 설정할 수 있다.

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

이런 방식으로 printf 같은 함수들도 필수 인자의 개수를 지정하여 유용하게 사용되곤 한다.

가변인수 메서드는 호출될 때마다 받은 인자를 배열에다가 할당하고 초기화하는 과정이 있기 때문에 그만큼 시간이 걸리게 된다.

예를 들어 메서드 호출의 95% 가 인수를 3개 이하로 사용한다고 하면, 다음처럼 0개인것 부터 4개인것 까지 총 5개를 다중정의하여 성능을 최적화시킬 수 있다.

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) {}
profile
하루하루는 성실하게 인생전체는 되는대로

0개의 댓글