Java에서는 다음과 같이 가변 길이 파라메터를 지원한다. 이 가변길이 파라메터는 재밌는 특성들이 있는데 이를 활용하는 방법을 알아보자.


우선 기본적인 사용법 부터 알아보도록 한다.

public static void target(String...strings){

    String[] array = strings; // 배열화 된다.

    for(String str : strings) System.out.println(str);

}

이 함수의 사용법은 아래와 같다.

target("A", "B", "C", "D");

target();

실행 결과는 아래와 같다.

A

B

C

D


이와 같이 0~* 개의 동일한 타입을 파라메터로 받을 수 있다. 만약 또 다른 파라메터와 함께 사용하고 싶다면 가변길이 파라메터는 맨 뒤에 위치 시켜야 한다.


자 여기서부터 재밌는 실험을 해보도록 하자. 혹시 가변길이 파라메터로 받은 인자를 가변길이 파라메터 함수에 다시 넣을 수 있을까? 코드는 아래와 같다.

public static void wrap(String...strings){

    target(strings); // 받은 가변 인자 파라메터를 그대로 넘김

}

      

public static void target(String...strings){

    String[] array = strings; // 배열화 된다.

    for(String str : strings) System.out.println(str);

}

다음과 같이 실행해 본다.

wrap("A", "B", "C", "D");

wrap();

실행 결과는 위와 같다. 즉, 가변인자 파라메터로 받은 인자를 다시 가변인자 파라메터로 넘기는 것이 가능하다.

재밌는 것은 가변길이 파라메터에 집어 넣은 파라메터들이 무엇으로 변환 되는지이다. target() 함수 두번째 줄에 보면 가변길이 파라메터들이 배열로 변환됨을 알 수 있다. 이것이 의미하는 바는 무엇인가? String...strings와 같은 가변인자 파라메터 형식은 여러 String 객체가 나열된 형식("a", "b", "c"와 같은)도 인자로 인정해 주고, String[] 형식 즉, 배열 한 개도 인자로 인정해 준다는 의미이다. 따라서 아래와 같은 사용도 가능하다.

String[] array = new String[]{"a", "b"};

target(array);

결과는 예상할 수 있을 것이다.


이 특성을 이용하면 몇가지 유틸리티 성 함수를 만들어 볼 수 있다. 우선 여러 개별 객체를 받아 배열로 변환해 주는 toArray(String...strings)와 같은 함수를 만들어 볼 수 있겠다.

public static String[] toArray(String...strings){

    return strings;

}


또한 객체의 배열을 인자로 받는 함수를 이용하기 쉽게 만들 수도 있다. 만약 제공된 API가 다음과 같은 모양이라고 가정하자.

public void api(Object[]);

이런 경우 가장 손쉽게 사용하는 방법은 api(new Object{......})와 같은 형식이다. 하지만 위의 toArray() 함수와 같이 한번 가변인자 파라메터로 통과 시켜 주면 더 간편하게 api() 함수를 사용할 수 있다.

Posted by 이세영2
,