728x90
가변인수는 메서드의 인수 개수가 정해지지 않았을 때 아주 유용하게 사용 할수 있음
가변인수 메서드를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네줌
단점 : 인수가 1개이상이여야할 경우 인수가 0개만 받을 수 있게 설계하는 것은 좋지 않음
- 런타임 에러 발생 가능, 이를 체크하기 위한 로직으로 코드가 지저분해짐
- for- each 문 사용하기 힘들어짐
- 성능에 민감한 경우 문제 발생(호출마다 배열 생성)
해결책 : 매개변수를 2개 받도록 함
첫번째로 평범한 매개변수를 받고, 가변인수를 두번쨰로 받음
public class Varargs {
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;
} // v1
static int min(int firstArg, int... remainingArgs) {
int min = firstArg;
for (int arg : remainingArgs)
if (arg < min)
min = arg;
return min;
} // v2
public static void main(String[] args) {
System.out.println(min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
System.out.println(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){}
//함수 호출의 95%는 3개이하의 인수 호출함 나머지 5%만을 가변인수 메서드로 처리
public void foo(int a1, int a2, int a3, int... rest){}
//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' 카테고리의 다른 글
interrupt vs notify (0) | 2021.03.16 |
---|---|
item 54) null이 아닌 빈 컬렉션이나 배열을 반환하라 (0) | 2021.03.12 |
HashMap 의 capacity와 load factor (0) | 2020.12.27 |
ThreadLocal (0) | 2020.11.22 |
Java 멀티쓰레드 동기화 - (3) AtomicClass (0) | 2020.10.24 |