Back/Spring Java

가변인자 Varargs

밍꿔 2019. 12. 18. 10:41


반응형

 

 

* 자바 1.5 이상 부터 가변 인자 메서드(Variable arity method)라고 부르는 varargs 메서드가

 

추가되었다. 이 메서드는 지정된 자료형의 인자를 0개 이상 받을 수 있다.

 

 

아래의 내용처럼 기존에는 다수의 매개변수를 인자로 받을때 배열 혹은 컬렉션을 사용 했다.

public final class Test {
    public static void display(List<String> list) {
        for(String s: list) {
            System.out.println(s);
        }
    }
    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");
        
        display(list);
    }
}

 

가변인자를 적용하게 되면,

public final class Test {
    public static void display(String ...strs) {
        for(String s: strs) {
            System.out.println(s);
        }
    }
    public static void main(String[] args) {
        
        display("Apple", "Banana", "Orange");
    }
}

 

변수 앞쪽에 위의 예제와 같이 ... 을 붙혀주면 컴파일러가 파라미터를 배열 형식으로 바꾸어버리

 

고, 매개변수로 주어지는 변수들을 모아서 객체로 만든다.

 

 

*가변인자 사용시 주의점

 

1. 가변인자는 여러개 사용될 수 없다. 그리고 가변인자는 항상 파라미터 마지막에 있어야 한다.

public final class Test {
    public static void display1(String totalPrice, String ...strs) {
        System.out.println("totalPrice : " + totalPrice);
        for(String s: strs) {
            System.out.print(s + " ");
        }
    }
    
    public static void main(String[] args) {
        display1("35000", "Apple", "Banana", "Orange");
    }
}

 

 

2. 인자 값이 많아 질 수록 메서드 호출 시 가독성이 떨어진다.

public final class Test {
    public static void display1(String totalPrice, String ...strs) {
        System.out.println("totalPrice : " + totalPrice);
        for(String s: strs) {
            System.out.print(s + " ");
        }
    }
    
    public static void main(String[] args) {
        display1("35000", "Test1", "Test2", "Test3","Test4","Test5","Test6" ...);
    }
}

 

 

3. 가변인자를 사용하게 되면 인자를 넣지 않아도 정상적으로 실행이 된다. 의도치 않은 결과

 

를 일으킬 수 있기 때문에 가변 인자를 사용할 때 가변인자의 길이를 가지고 Exception을 호

 

출하거나, 사용자가 인지하고 방어적 코드를 기재해야한다.

public final class Test {    
    public static void varargsTest1(String ...args) {
        
    }
    
    public static void varargsTest2(String args) {
        
    }
    
    public static void main(String[] args) {
        varargsTest1();
        varargsTest2(); //실행하기 전에 Error 
    }
}

 

4. 성능 이슈

 

varargs 메서드를 호출할 때마다 배열이 만들어지고, 초기화가 대기 때문에 오버헤드를 감당할

 

수 없을 거라생각된다면 다른 패턴을 따를 수도 있다. 가령 95%의 메서드를 호출할 때 3개 이하

 

의 인자가 전달된다고 하면 아래처럼 오버로딩 메서드를 준비하는 것이다. 마지막 메서드가 인

 

자 수가 3개보다 클 때 이용되는 varargs 메서드이다.

 

public void cal(){};
public void cal(int args1){};
public void cal(int args1, int args2){};
public void cal(int args1, int args2, int args3){};
public void cal(int args1, int args2, int args3, int ...args){};

이렇게 하면 5% 정도의 호출에 대해서만 새로운 배열이 만들어진다. 

 

 

 

 

출처 : https://ktko.tistory.com/m/entry/Effective-Java-42-varargs%EB%8A%94-%EC%8B%A0%EC%A4%91%ED%9E%88-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC

 

 

 

 

반응형

'Back > Spring Java' 카테고리의 다른 글

Blob형태의 이미지 파일 입출력  (0) 2019.12.19
Spring Security Login  (2) 2019.12.18
제네릭(Generic) 문법  (0) 2019.11.25
Lombok - @Slf4j  (0) 2019.11.25
Java8 null체크 시 Optional  (0) 2019.11.24