Skip to content

Latest commit

 

History

History
85 lines (64 loc) · 2.26 KB

가변인수는_신중히_사용하라.md

File metadata and controls

85 lines (64 loc) · 2.26 KB

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


가변인수

  • 매개변수로 들어오는 값의 개수와 상관 없이 동적으로 인수를 받아 기능하도록 해주는 문법

  • ex) printf

    public PrintStream printf(String format, Object ... args) {
            return format(format, args);
        }

간단한 가변인수 메서드

static int sum(int... args) {
    int sum = 0;
    for (int arg : args)
        sum += arg;
    return sum;
}

인수가 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;
}
  • 인수를 0개만 넣어 호출하면 런타임에 실패한다.
  • 코드가 지저분하다.
  • args의 유효성 검사를 명시적으로 해야한다.
  • min의 최소값을 Integer.MAX_VALUE로 설정하지 않고 for-each문을 사용할 수 없다.

인수가 1개 이상이어야하는 가변인수 메서드 - 올바른 예

static int min(int firstArgs, 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 a3) { }
public void foo(int a1, int a2, int a3, int... rest) { }
  • 해당 메서드 호출의 95%가 인수를 3개 이하로 사용한다고 가정하자.
    • 인수가 0 ~3개인 것 까지 메서드를 각각 정의한다.
    • 마지막 다중정의 메서드가 인수가 4개 이상인 5% 호출을 담당한다.
  • ex) EnumSet