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

신명철·2022년 3월 18일
0

Effective Java

목록 보기
51/80

가변인수 메서드

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

예컨대 인수가 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;
}

이 방식에는 문제가 있다. 인수를 0개만 넣는 경우 컴파일 타임이 아니라 런타임에 오류를 판단할 수 있다는 점이다. 인수가 1개 이상이어야 할 때 제대로 사용하는 방법은 다음 코드와 같다.

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

성능에 민감한 경우

가변인수 메서드는 호출될 때마다 배열을 생성하고 초기화한다. 성능에 민감한 경우라면 이 비용이 감당할 수 없을수 있다. 이 때 사용할 수 있는 멋진 패턴이 있다.

예를 들어 매개변수 메서드의 호출의 95% 가 인수를 3개 이하로 사용한다고 해보자. 그렇다면 0개부터 4개인 것까지, 총 5개를 정의하자. 마지막 다중정의 메서드가 인수 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개의 댓글