Google AdSense


[Java] 가변인자(varargs : Variable Argument List) by Sigel

일을 하다가 메소드 전달인자 수가 가변적인 부분이 생겼다. ArrayList를 사용하자니 전달인자 수가 너무 작다. 그렇다고 배열을 사용하자니 미리 그 수가 몇 개인지 예측하기가 힘들다. 어떻게 할까 생각하던 중 오랜만에 머리를 스치고 지나가는 가변인자(varargs : Variable Argument List)라는 것이 있었다.

가변인자(사실, 이 개념을 뭐라고 불러야 하는지 정확하게 모르겠다. 약간의 검색을 하긴 했지만 이 이름이 정확하지 않을 수 있다.)는 C언어에서 아주 자주 보던 printf의 전달인자 같은 것이다. printf의 전달인자는 다음 예제의 num과 같이 콤마(',')를 이용하여 얼마든지 줄 수 있지 않은가?? 이 개념이 아주 오래전.. 3년전인가?? JDK 5.0버전부터 Java에도 추가되었다.

#include <stdio.h>

int main( int argc, String *args[] )
{
    int num = 123;
    printf("The number is %d\n", num);
    return 0;
}


그럼 Java에서는 이 개념을 어떻게 사용할 수 있을까?? 간단하다. 다음 예제를 보자.

public static void main(String [] args
{
    foo(1, 2, 3);
    foo(1, 2, 3, 4, 5);
}

public static void foo(int ... nums)
{
    for(int num : nums)
    {
        System.out.print(num);
    }
    System.out.println();
    System.out.printf("The last number of list is %d\n", nums[nums.length - 1]);
}


위의 예제와 같이 main 메소드에서는 C언어와 동일하게 가변적으로 전달인자를 줄 수 있다. 호출받는 함수에서는 전달인자의 자료형과 변수명 사이에 점 3개를 찍으면 된다.

    void foo(int ... nums)


그리고 그 변수는 배열과 동일하게 사용하면 된다. 배열이기 때문에 전달인자의 최대개수는 배열의 최대 사이즈와 동일하다. 역시 JDK 5.0에서 추가된 enhanced for loop에서 배열이기 때문에 쉽게 사용될 수 있다. enhanced for문은 다른 언어에 있는 foreach와 비슷하다. 위의 for문은 다음과 같은 내용이다.
    int num = 0;
    for(int i=0; i    {
        num = nums[i]
        System.out.print(num);
    }

생각해 보면 쉽다. 그냥 배열이나 List, Set 등과 같은 객체의 요소를 처음부터 끝까지 순회해 주는 것이다. 사실 Iterator 객체를 안 좋아해서 for문으로 get(i)를 해서 많이 썼는데 덕분에 편해졌다. ㅋ 단, 디버깅할 때 인덱스가 없기 때문에 몇 번째 요소인지 알아보기가 힘들다는 점이 =ㅅ=;; 머.. Iterator도 인덱스가 없는건 마찬가지다.


+ enhanced for문은 코드가 간결해 지는 것 같아 자주 애용하는데.. 자꾸 윗분께서 이런 새로운(이라고 쓰고 3년이나 지났다고 읽는다) 기술, 개념은 되도록 쓰지 말라고 한다. TㅅT 복잡해지고, 검증이 안됐으며, 남들이 못 알아본다나..-ㅅ-;;


- 참고자료
  • Java 5.0의 varags와 enhanced for loop
  • Using Variable Argument Lists and Some Things You Should Know About Floating-Point Arithmetic from Technical Articles and Tips
  • 가변 arity 메소드 (아랫 참고자료를 번역기로 돌린 것으로 보임)
  • Variable arity methods

  • 트랙백

    이 글과 관련된 글 쓰기 (트랙백 보내기)
    TrackbackURL : http://entireboy.egloos.com/tb/3783699 [도움말]

    덧글

    덧글 입력 영역