IT/Programming / / 2023. 4. 26. 13:41

<Effective Java> RULE 42 var args는 신중히 사용하라

반응형

 

Java 1.5부터 가변인자 메서드 var args가 추가되었다.

var args는 자료형의 인자를 0개 이상을 받을 수 있다.

 

동작원리

1. 클라이언트에서 전달한 인자 수에 맞는 배열이 자동 생성

2. 모든 인자가 해당 배열에 대입

3. 해당 배열이 메서드에 인자로 전달

 

var args의 간단한 사용 예

/**
 * 
 * int인자를 받아서 그 합을 반환하는 varargs메서드.
 * sum(1,2,3)과 같이 호출하면 6이
 * 그리고 sum()과 같이 호출하면 0이 호출
 * 
 * @author    ismyeong
 * @writeday  2018. 3. 14.
 *
 */
static int sum(int... args) {
    int sum = 0;
    for(int arg : args) {
        sum+=arg;
    }
    return sum;
}
 

 

하나 이상의 인자를 받아야 하는 var args 메서드를 잘못 구현한 사례

/**
 * 
 * 인자 없이 메서드를 호출할 수 있다
 * args의 유효성을 검사하는 코드를 명시적으로 넣어야 한다.
 * 보기 좋지 않은 코드.
 * 
 * @author    ismyeong
 * @writeday  2018. 3. 14.
 *
 */
static int min(int... args) {
    if(args.length == 0) {
        throw new IllegalArgumentException("Too few arguments");
    }
    int min = args[0];
    for(int i = 1 ; i < args.length ; i++) {
        if(args[i] < min) {
            min = args[i];
        }
    }
    return min;
}
 
/**
 * 
 * 하나 이상의 인자를 받는 var args 메서드를 제대로 구현한 예제
 * 
 * @author    ismyeong
 * @writeday  2018. 3. 14.
 *
 */
static int minGood(int firstArg, int... remainArgs) {
    int min = firstArg;
    for(int arg : remainArgs) {
        if(arg < min) {
            min = arg;
        }
    }
    return min;
}
 

마지막 인자가 배열이라고 해서 무조건 뜯어 고칠 생각을 하지 말아야 한다.

varargs는 정말로 임의의 개수의 인자를 처리할 수 있는 메서드를 만들어야 할 때만 사용하라

성능이 중요한 환경이라면 varargs사용에 더욱 신중해야 한다.

varargs메서드를 호출할 때마다 배열이 만들어지고 초기화되기 때문이다.

 

가령 95% 정도는 메서드를 호출할 때 3개 이하의 인자가 전달된다고 생각하자.

오버로딩 메서드가 인자 개수가 3개 보다 클 경우 varargs를 사용한다.

그러면 5% 정도 호출에 대해서만 새로운 배열이 만들어 진다. (필요한 경우에만 사용하라는 말)

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... rest);
 

결론

· var args메서드는 인자 개수가 가변적인 메서드를 정의할 때 편리 하지만, 남용되면 곤란하다.

· 부적정하게 사용되면 혼란스러운 결과를 초래할 수 있다.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유