[교재 EffectiveJava] 아이템 53. 가변인수는 신중히 사용하라

반응형
728x90
반응형

가변인수 메서드

가변인수(varags) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다.

* 가변 인수 메서드 호출 과정
1) 먼저 인수의 개수와 길이가 같은 배열을 만든다.
2) 만들어진 인수들을 이 배열에 저장한다.
3) 배열을 가변 인수 메서드에 건네준다. 

 

가변인수 예제코드
package com.java.effective.item53;

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        System.out.println(sum(1, 2, 3));
    }

    static int sum(int... args) {
        return Arrays.stream(args).sum();
    }
}

인수가 1개 이상이어야 할 경우도 있다. 인수 개수는 런타임에 자동 생성된 배열의 길이로 알 수 있다. 인수 개수가 0개일 경우 에러를 발생시켜보자.

 

잘못된 예시
package com.java.effective.item53;

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        System.out.println(sum(1, 2, 3));
    }

    /**
     * 인수가 0 개이면 컴파일 타임이 아닌 런타임에 알 수 있다.
     * @param args
     * @return
     */
    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;
    }
}

args로 모두 받으려하지말고, 매개변수를 나눠보자. 첫번째로는 평범한 매개변수를 받고, 두번째에 가변인수를 받자.

 

해결코드
package com.java.effective.item53;

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        System.out.println(sum(1, 2, 3));
    }

    static int min(int firstArg, int... remainingArgs) {
        int min = firstArg;
        for (int arg : remainingArgs) {
            if (arg < min) {
                min = arg;
            }
        }

        return min;
    }
}

 

 

가변인수의 유연성

가변인수는 인수 개수가 정해지지 않았을대 아주 유용하다. 그런데 성능에 민감한 상황이라면, 가변인수가 걸림돌이 될 수 있다. 호출 될때마다 배열 하나를 새로 할당하고 초기화하기 때문이다. 

 

이 비용을 감당할 수는 없지만 가변 인수의 유연성이 필요할때 선택할 수 있는 패턴이 존재한다. 예를 들어 해당 메서드 호출의 95%가 인수를 3개 이하로 사용한다고 해보자. 그렇다면 다음 처럼 인수가 0개인 것부터 4개인 것까지 총 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 a3, int... rest) {}

 

 

반응형

Designed by JB FACTORY