가변 인자가 생기기 전에

자바는 오버로딩이라는 기능이 구현되어 있어서 매개변수의 개수와 타입이 달라도 같은 이름의 메소드명으로 동일 기능을 구현 할 수 있습니다.

<aside> ❗ 오버로딩의  조건


  1. 메소드 이름이 같아야 함
  2. 매개변수의 개수 또는 타입이 달라야 함 </aside>

그래서 매개변수의 타입이 달라도 하나의 메소드명으로 오버로딩 할 수 있고 또 매개변수의 개수가 달라도 역시 오버로딩 가능합니다.

여기서 드는 생각이 만약 매개변수의 개수가 사용자의 쓰임에 따라 달라진다면? 또 그 수가 무한이 늘어난다면??

일일이 매개변수 하나하나 오버로딩 해주어야 할 것인가? 라는 의문이 생기게 되죠.

String divide(String s1, String s2){...}
String divide(String s1, String s2, String s3){...}
String divide(String s1, String s2, String s3, String s4){...}
String divide(String s1, String s2, String s3, String s4, String s5){...}

다행히도 JDK1.5부터 매개변수의 개수를 동적으로 지정해 줄 수 있게 되었는데 이 기능을 **가변 인자(variable argument)**라고 합니다.

가변 인자가 없었던 전 버전에서는 매개변수로 컬렉션이나 배열을 사용 했었습니다.

public static void main(String args[]) {
    Varargs v = new Varargs();
    Vector<String> ve = new Vector<String>();
    ve.add("a");
    ve.add("b");
    v.sum(ve);
}

void sum(Vector<String> v) {
	  for(Object a: v)
	      System.out.println(a);
}
public static void main(String args[]) {
    Varargs v = new Varargs();
    String [] s = {"a", "b", "c"};
    v.sum(s);
}

void sum(String [] str) {
    for(String a:str)
        System.out.println(a);
}

이 같은 경우 따로 백터 객체를 만드는 등 조금 복잡하고 v.sum()과 같이 인자를 생략해 줄 수 없습니다.

가변 인자 사용법

키워드 ... 을 사용합니다.

void sum(String...str) {
    for(String a:str)
        System.out.println(a);
}