[Effective Java] 가변인수는 신중히 사용하라

들어가며

가변 인수를 사용할 때는 신중해야 한다. 다음 코드를 보자.

1
2
3
4
5
6
7
8
9
static int min(int... args) {
if (args.length == 0)
throw new IllegalArgumentException("no arguments included");
int min = args[0];
for(int i = 1; i < args.length; i++)
if(args[i] < min)
min = args[i];
return min;
}

위의 코드는 인수를 0개를 넣는 경우를 제하기 위해 런타임에 에러를 던진다. 또한 코드도 지저분하다. 해법은 매개변수를 2개 받는것이다. 다음 코드를 보자.

1
2
3
4
5
6
7
static int min(int firstArg, int... remainingArgs) {
int min = firstArg;
for(int arg : remainingArgs)
if (arg < min)
min = arg;
return min;
}

2개의 매개변수 덕분에 유효성 검사를 하지 않아도 되며 for-each 구문도 사용할 수 있게 되었다. 하지만 가변인수 메소드가 성능에 민감한 상황이라면 걸림돌이 될 수 있다. 가변인수 메소드는 호출될 때마다 배열을 새로 하나 할당하고 초기화하기 때문이다. 그럴때는 다음과 같은 방법이 있다. 예를 들어 메소드 호출의 대부분이 인수가 n개 이하라면 n개 초과인 요청부터는 가변인수로 받는 것이다.

1
2
3
4
public void foo() {}
public void foo(int a1) {}
public void foo(int a1, int a2) {}
public void foo(int a1, int a2, int... rest) {}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/17/Languages/Effective%20JAVA/item53/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.