이것도 J2SE 5.0에 새로 추가된 기능 중에 하나로 "임의 개수의 인수를 받을 때" 사용합니다.

5.0  이전에서 임의의 갯수의 인자를 넘겨주고 싶을 때는  배열을 만들어서 넘겨주고 받는 쪽에서도 배열로 받아야 했습니다.

   @Test
   public void passArray(){
       int[] numbers1 = {1, 2, 3, 4, 5};
       int[] numbers2 = foo(numbers1);

       assertTrue(Arrays.equals(numbers1, numbers2));
   }

   private int[] foo(int[] numbers){
       return numbers;
   }

5.0 부터는 넘겨줄 때 배열을 만들어서 넘기지 않아도 받을 때 알아서 배열로 받아주는(물론 배열을 넘겨도 됩니다.) 가변인수 라는 것이 생겼습니다. 모양은 쩜 세 개 ... 이것입니다.

   @Test
   public void primitiveVargs(){
       int[] array1 = foo(1, 2, 3, 4, 5);  //배열을 만들지 않아도 넘어갑니다.
       int[] array2 = foo(array1);         //배열을 넘겨도 넘어갑니다.

       assertTrue(Arrays.equals(array1, array2));
   }

   private int[] foo(int... numbers) {    //가변인수를 사용했기 때문이지요.
       return numbers;
   }

private int[] foo(int... numbers) 이것과 private int[] foo(int[] numbers) 둘 다 존재하면 충돌이 일어납니다. 둘 중에 하나만 있어야 합니다. 가변인수도 일종의 배열이기 때문에 그런것 같습니다.