티스토리 뷰

반응형

가변인수 메서드

  • 명시한 타입의 인수를 0개 이상 받을 수 있는 메서드
  • 가변인수 메서드를 호출하면 먼저 인수 개수와 길이가 같은 배열을 만들고 이 배열에 저장하여 가변인수 메서드에 건네줌
static int sum(int... args) {
    int sum = 0;
    for (int arg : args) {
        sum += arg;
    }
    return sum;
}
// 인수가 꼭 1개 이상이어야할때
static int min(int firstArg, int... remainArgs) {
    int min = firstArg;
    for (int arg : remainArgs) {
    if(arg < min)
           min = arg;
    }
    return min;
}
  • 가변인수는 인수 개수가 정해지지 않았을 때 매우 유용함. ex) printf와 리플렉션

 

성능에 민감할 때

성능에 민감한 상황이라면 가변인수가 걸림돌이 될 수 있다.

가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화하기 때문

해당 메서드 호출의 95%가 인수를 3개 이하로 사용한다고 할 때, 다음처럼 다중정의하자.

(마지막 다중정의 메서드는 인수 4개 이상인 5%의 호출을 담당)

static int foo() { }
static int foo(int a1) { }
static int foo(int a1, int a2) { }
static int foo(int a1, int a2, int a3) { }
static int foo(int a1, int a2, int a3, int... rest) { }  //단 5%만 배열 생성

EnumSet의 정적 팩터리도 위 기법을 사용하여 열거 타입 집합 생성 비용을 최소화함

public static <E extends Enum<E>> EnumSet<E> of(E e) {
    EnumSet<E> result = noneOf(e.getDeclaringClass());
    result.add(e);
    return result;
}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) {
    EnumSet<E> result = noneOf(e1.getDeclaringClass());
    result.add(e1);
    result.add(e2);
    return result;
}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) {
    EnumSet<E> result = noneOf(e1.getDeclaringClass());
    result.add(e1);
    result.add(e2);
    result.add(e3);
    return result;
}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) {
    EnumSet<E> result = noneOf(e1.getDeclaringClass());
    result.add(e1);
    result.add(e2);
    result.add(e3);
    result.add(e4);
    return result;
}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4,
                                                    E e5) {
    EnumSet<E> result = noneOf(e1.getDeclaringClass());
    result.add(e1);
    result.add(e2);
    result.add(e3);
    result.add(e4);
    result.add(e5);
    return result;
}

@SafeVarargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
    EnumSet<E> result = noneOf(first.getDeclaringClass());
    result.add(first);
    for (E e : rest)
        result.add(e);
    return result;
}

 

결론

인수 개수가 일정하지 않은 메서드를 정의해야 한다면 가변인수가 반드시 필요하다.

메서드를 정의할 때 필수 매개변수는 가변인수 앞에 둬라.

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday