본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


자바 1.5에서 가변 인자 메서드(Variable arity method)라고 부르는 varargs 메서드가 추가되었다. 이 메서드는 지정된 자료형의 인자를 0개 이상 받을 수 있다.


가변인자가 없었다면 컬렉션이나 배열을 통해 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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("ktko");
        list.add("kyungtae");
        list.add("Ko KyungTae");
        
        display(list);
    }
}



1.5 부터 추가된 가변인자를 사용하게 된다면 ? 아래와 같이 파라미터 변수에 ...을 파라미터 변수명 앞에 붙여주면 된다.

1
2
3
4
5
6
7
8
9
10
11
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("ktko""kyungtae""Ko KyungTae");
    }
}



가변인수는 컴파일러의 눈속임과 비슷하다. 파라미터의 앞에 ...을 붙여주면 컴파일러가 파라미터를 배열 형식으로 바꾸어버리고, 매개변수로 주어지는 변수들을 모아서 객체로 만들어버린다.

이 것을 확인하려면 jad 역컴파일러를 이용해서 보면 쉽게 알 수 있다. 


가변인자를 사용하면 무조건 가변인자만 사용할 필요는 없다. 아래 예제를 보면 String로 선언된 나이, 그리고 가변인자를 선언한 strs를 보면 처음 파라미터로 들어온 age는 배열이 아닌 것으로 사용된다.

가변인자를 사용할 때 주의할 점 2가지가 있다.


1. 가변인자는 여러개 사용될 수없다.(직접 해보았는데 아니라면 댓글을..) 그리고 가변인자는 항상 파라미터 마지막에 있어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
public final class Test {
    public static void display1(String age, String ...strs) {
        System.out.println("age : " + age);
        for(String s: strs) {
            System.out.print(s + " ");
        }
    }
    
    public static void main(String[] args) {
        display1("30""ktko""kyungtae""Ko KyungTae");
    }
}



2. 가변인자를 사용하게 되면 인자를 넣지 않아도 정상적으로 실행이 된다. 의도치 않은 결과를 일으킬 수 있기 때문에 가변 인자를 사용할 때 가변인자의 길이를 가지고 Exception을 호출하거나, 사용자가 인지하고 방어적 코드를 기재해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 
    }
}