Item53. 가변인수는 신중히 사용하라
가변인수
가변인수 method는 명시한 타입의 인수를 0개 이상 받을 수 있다.
가변인수 method를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고, 인수들을 이 배열에 저장하여 가변인수 method에 건네준다.
1 | static int sum(int... args){ |
가변인수 개수가 1개 이상이여야만 할떄가 있다. 예를 들면 최솟값을 찾는 method에서 인수0개가 들어오면 exception이 터져야 한다.
1 | static int min(int... args){ |
위 방식의 문제점은 가변인수의 인수를 넣지 않아도 호출되어 runtime에 실패한다는 점이다. 또한 가변인수에 대한 유효성 검사도 명시적으로 해야 한다.
이를 더 나은 방법으로 runtime이 아닌 compile time에 에러가 나오도록 수정하면 다음과 같다.
1 | static int min(int firstArg , int... remainingArgs){ |
매개변수를 2개 받아서, 첫번째 매개변수는 필수여야하는 인수를 넣고, 두번째는 가변인수로 받아서 인수가 1개 미만일떄는 compile error가 터진다
가변인수 성능 최적화
성능상 민감한 상황때문에 가변인수를 사용할수 없는 상황이 있다, 가변 인수 method는 호출될 때마다 배열을 새로 하나 할당하고, 초기화하기 떄문이다.
이럴떄는 다중정의를 사용하여 해결한다. 예를 들면 method의 매개변수가 3개이하로 호출하는게 대부분이고, 4개이상부터는 5% 미만정도 비율로 호출된다고 하면
자주 호출되는 매개변수 개수에 대해서는 method를 overloading 하고, 그 이상의 매개변수 개수에 대해서는 가변인수로 만들면 된다.
1 | public void foo(){} |
참고로 EnumSet의 정적 팩터리 method도 이 기법을 사용해서 열거 타입 집합 생성 비용을 최소화한다고 한다.