Java ‐ 가변인수는 신중히 사용하라[Effective Java Item 53] - woojin-playground/Backend-PlayGround GitHub Wiki
가변인수는 신중히 사용하라
- 가변인수(varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다.
- 가변인수 메서드를 호출하면 가장 먼저 인수 개수와 길이가 같은 배열을 만들고 이 인수들을 배열에 저장하여 가변인수 메서드에 건네준다.
- 만약 다음과 같이 인수가 1개 이상이어야 할 때도 있다. 예컨대 최솟값을 찾는 메서드인데, 인수를 0개만 받을 수 있도록 설계하는 것은 좋지 않다. 인수 개수는 런타임에 자동으로 생성된 배열 길이로 알 수 있다.
// Bad
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의 초기값을 Integer.MAX_VALUE로 설정하지 않고는 for-each문도 사용할 수 없다.
- 다음과 같이 매개변수를 2개 받도록 하면 된다.
static int min(int firstArg, int ... args) {
int min = firstArg;
for (int arg: args) {
if (arg < min) {
min = arg;
}
}
return min;
}
- 그러나 성능에 민감한 상황이라면 가변인수가 문제가 될 수 있다.
- 가변인수 메서드의 경우 호출될 때마다 배열을 새로 하나 할당하고 초기화를 한다.
- 만약 가변인수를 필요로 한다면 메서드를 정의할 때, 필수 매개변수는 가변 인수 앞에 두고, 가변인수를 사용할 때는 성능 문제를 같이 고려하자.