핵심 정리
가변인수는 필요에 따라 개수가 달라질 수 있는 인수를 메소드에 넘길 때 유용하다. 그러나 메소드가 호출될 때마다 배열을 새로 할당하고 초기화하는 비용이 발생한다. 따라서 성능에 민감한 상황에서는 메소드 오버로딩을 통해 성능을 최적화하도록 하자.
가변인수 예시
: int 인수들의 합을 계산해주는 가변인수 메소드
간단한 가변인수 활용 예
static int sum(int... args) {
int sum = 0;
for (int arg : args)
sum += arg;
return sum;
}
인수가 1개 이상이어야 하는 가변인수 메소드 - 잘못 구현한 예
public static int min(int... args) {
if (args.length == 0) {
throw new IllegalArgumentException("인수가 1개 이상 필요합니다.");
}
int min = args[0];
for (int i = 0; i < args.length; i++) {
if(args[i] < min) {
min = args[i];
}
}
return min;
}
@Test
public void minTest(){
int min = min();
System.out.println("min = " + min);
}
- 문제점
- 인수가 0개일 경우 컴파일 타임이 아닌 런타임에 실패한다.
- 코드의 가독성이 좋지 않다.
인수가 1개 이상이어야 하는 가변인수 메소드 - 잘 구현한 예
public static int min2(int firstArg, int... args) {
int min = firstArg;
for (int arg : args) {
if (min > arg) {
min = arg;
}
}
return min;
}
가변인수의 성능
가변인수는 메소드 호출 시마다 배열을 할당하고 초기화하는 과정이 발생한다. 이는 약간의 오버헤드를 가지며, 최적화를 원한다면 가변인수를 사용하는 메소드를 적절히 설계해야 한다.
예시 1 - 메소드 호출의 95%가 인수를 3개 이하로 사용
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) { }
메소드 호출 중 5%의 경우 배열을 생성한다.
예시 2 - EnumSet
EnumSet의 정적 팩토리 메소드도 비슷한 원리로 동작한다.
(EnumSet은 enum의 원소를 비트 벡터로 표현하는 자료구조이다.)
import java.util.EnumSet;
import java.util.Set;
public class EnumSetExample {
public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
public void printWeekendDays(Set<Day> days) {
System.out.println("Weekend days: " + days);
}
public static void main(String[] args) {
EnumSetExample example = new EnumSetExample();
// 인수 3개 이하인 경우
example.printWeekendDays(EnumSet.of(Day.SATURDAY, Day.SUNDAY));
// 인수 4개 이상인 경우
example.printWeekendDays(EnumSet.of(Day.SATURDAY, Day.SUNDAY, Day.MONDAY, Day.TUESDAY));
}
}
위 예시는 EnumSet.of() 메소드를 사용해 열거 타입 Day의 집합을 생성한다. of() 메소드는 미리 생성된 인스턴스를 반환하는 방식으로 동작하므로, 새로운 EnumSet 인스턴스를 매번 생성하는 오버헤드를 피할 수 있다.
'Language > Java' 카테고리의 다른 글
| [effective java] 아이템 55. 옵셔널 반환은 신중히 하라. (0) | 2023.07.17 |
|---|---|
| [effective java] 아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라. (0) | 2023.07.17 |
| [effective java] 아이템 52. 다중정의는 신중히 사용하라. (0) | 2023.07.17 |
| [effective java] 아이템 51. 메서드 시그니처를 신중히 설계하라. (0) | 2023.07.17 |
| [effective java] 아이템 50. 적시에 방어적 복사본을 만들라. (0) | 2023.07.17 |