Search

아이템53 : 가변인수는 신중히 사용하라

가변인수(varargs)란? 명시한 타입의 인수를 0개 이상 받을 수 있다.

 가변인수를 호출하면 발생하는 일

static int sum(int... numbers) { int result = 0; for (int number : numbers) { result += number; } return result; }
Java
1.
메서드 호출
2.
인수의 개수와 길이가 같은 배열 생성
3.
인수들을 배열에 저장
4.
가변인수 메서드에 건네준다.

 주의해야 할 점

인수를 0개만 받을 수 있도록 설계하는 것은 좋지 않다.
인수 개수에 따라 런타임에 오류가 검출될 수 있다.
이에 대한 유효성 검사를 명시적으로 하면 코드가 지저분할 수 있다.
첫 번째 매개변수를 평범한 매개변수를 받고, 두 번째로 가변인수를 받으면 문제를 해결할 수 있다.
성능에 민감한 상황이면 가변인수는 걸림돌이 될 수 있다.
메서드 호출마다 배열을 새로 할당받고 초기화하기 때문이다.
이를 해결하기 위한 아래와 같은 패턴이 있다. (EnumSet은 아래 기법과 비트 필드를 활용하고 있다)
// 95%가 인수를 3개 이하로 사용할 때, 유용하게 쓰일 수 있다. 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) { }
Java

 핵심 요약

인수 개수가 정해지지 않는 메서드에 가변인수가 필요하다.
필수 매개변수는 가변인수 앞에 두자.
성능 문제까지 고려하자.