[Effective Java] 아이템53 - 가변인수는 신중히 사용하라
int... args
와 같이 가변인수를 메서드에 파라미터로 넘길 수 있다. 메서드가 호출되면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고, 인수들을 이 배열에 저장하여 메서드에 건네준다.
-
인수가 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; }
이 방식에는 메서드가 실행됬을 때 (런타임) 파라미터의 유효성을 검사해서 Exception 을 던진다. 이런 방식 보다 명시적으로 필수로 받아야하는 파라미터는 받고, 옵셔널한 인수들을 가변인수로 받도록 구현하면 더 깔끔한 코드가 된다.
-
인수가 1개 이상이어야 하는 가변인수 메서드 (올바른 예)
static int min(int firstArg, int... remainingArgs) { int min = firstArg; for (int arg : remainingArgs) if (arg < min) min = arg; return min; }
성능에 민감한 상황이라면 가변인수가 좋은 방법은 아니다. 왜냐하면 메서드가 호출될 때마다 배열을 새로 하나 할당하고 초기화하기 때문이다. 만약 성능을 고려해야한다면 다중정의를 하자
public void foo() {}
public void foo(int a1) {}
public void foo(int a1, int a2) {}
public void foo(int a1, int a2, int... rest) {}
비트필드를 대체하면서 성능가지 유지한 EnumSet의 of
메서드가 이와 같은 패턴으로 구현되어 있다.
댓글남기기