이펙티브 자바에서 읽었던 가변 인수에 대한 것을 정리해보았습니다.
가변 인수(varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을수있습니다. 가변 인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 열을 만들고 인수들은 이 배열에 저장하여 가변 인수 메서드에 건네줍니다.
인수가 1개 이상이어야 할 때도 있습니다. 예를 들어 최솟값을 찾는 메서드인데 인수를 0개만 받을 수도 있도록 설계하는 것은 좋지 않습니다.
static int min(int... args){
if(args.length ==0){
throw new IllegalStateException("인수가 1개 이상 필요합니다");
}
int min = args[0];
for(int i=0;i<args.length;i++){
if(args[i]<min){
min = args[i];
}
}
return min;
}
이 방식에는 몇 가지의 문제가 있습니다. 가장 심각한 문제는 인수를 0개만 넣어 호출하면(컴파일 x) 런타임에 실패합니다. 또한, 코드도 지저분하고, args 유효성 검사를 명시적으로 해야 하고, min의 초기값을 Integer.MAX_VALUE로 설정하지 않고는 for-each문도 사용할 수 없습니다. 이 코드를 한번 리팩터링 해보겠습니다.
위에 문제를 다음 코드처럼 매개변수를 2개 받도록 하면 됩니다. 즉, 첫 번째로 매개변수를 받고, 가변 인수는 두 번째로 받으면 앞의 문제를 해결할 수 있습니다.
static int min(int firstArg, int... remainingArgs){
int min = firstArg;
for(int arg : remainingArgs){
if(arg<min){
min = arg;
}
}
return min;
}
위 예시처럼 가변인수는 인수 개수가 정해지지 않았을 경우 유용하게 사용할 수 있습니다. 하지만, 성능에 민감한 상황이라면 가변 인수가 걸림돌이 될수있습니다. 가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화합니다.
정리
인수 개수가 일정하지 않은 메서드를 정의해야 한다면 가변 인수가 반드시 필요합니다. 메서드를 정의할 때 필수 매개변수는 가변인수 앞에 두고, 가변 인수를 사용할 때는 성능 문제까지 고려해야 합니다.
'혼자 공부하는 것들 > JAVA' 카테고리의 다른 글
Objects.requireNonNull은 왜 사용할까? (0) | 2023.06.01 |
---|---|
Java11 람다식에서 VAR를 사용할 수 있다고? (0) | 2022.07.02 |
익명 클래스하고 람다식은 어떤 상황일 때 사용해야할까? (2) | 2022.03.10 |
[동시성 이슈해결] HashMap보다는 ConcurrentHashMap을 쓰자! (0) | 2022.01.01 |
서블릿의 라이프 사이클 (0) | 2021.12.29 |
댓글