티스토리 뷰
반응형
가변인수 메서드
- 명시한 타입의 인수를 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;
}
결론
인수 개수가 일정하지 않은 메서드를 정의해야 한다면 가변인수가 반드시 필요하다.
메서드를 정의할 때 필수 매개변수는 가변인수 앞에 둬라.
반응형
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] 55.옵셔널 반환은 신중히 하라 (0) | 2022.04.06 |
---|---|
[Effective Java] 54.null이 아닌, 빈 컬렉션이나 배열을 반환하라 (0) | 2022.04.04 |
[Effective Java] 52.다중정의는 신중히 사용하라 (0) | 2022.04.04 |
[Effective Java] 51.메서드 시그니처를 신중히 설계하라 (0) | 2022.04.04 |
[Effective Java] 50.적시에 방어적 복사본을 만들라 (0) | 2022.04.04 |
댓글