앞에서 메서드 시그니처는 입력매개변수의 개수 또는 입력매개변수의 자료형에 따라 구분된다고 했다. 만일 어떤 메서드가 입력매개변수로 0~10개 사이의 int 자료형 값을 받는다고 가정하자. 정확히 몇 개의 입력이 들어올지 모르므로 0 ~ 10개, 즉 11개의 메서드를 모두 오버로딩 해야 한다. 만일 전달되는 입력매개변수의 개수 범위가 더 크면 더 많은 메서드를 오버로딩해야한다. 이를 간단하게 할 수 있는 방법이 가변 길이 배열 입력매개변수다. 개수가 정해지지 않은 가변 길이의 압력을 받는 입력매개변수로 입력된 값들은 배열로 저장된다. 그리고 이 배열의 크기는 함수가 호출될 때 전달된 입력값의 개수로 정해진다. 배열 자체가 1개의 자료형만 묶어 저장할 수 있으므로 입력되는 모든 값은 당연히 같은 자료형이어야 한다. 가변 길이 배열 입력매개변수의 문법은 다음과 같다.
🐬가변 길이 배열 입력매개변수
리턴 타입 메서드명 (자료형... 참조 변수명) {
...
}
자료형 다음에 말줄임표(...)가 있는 것이 조금 특이하다. 이를 활용한 예를 살펴보자.
🐬가변 길이 배열 입력매개변수를 활용한 메서드의 호출 예
public class jh {
public static void main(String[] args) {
// 가변 길이 int 배열 입력매개변수
method1(1, 2); // 입력매개변수 길이 : 2
method1(1, 2, 3); // 입력매개변수 길이 : 3
method1(); //입력매개변수 길이 : 0
// 가변 길이 String 배열 입력매개변수
method2("안녕","방가"); // 입력매개변수 길이 : 2
method2("땡큐","베리","감사"); // 입력매개변수 길이 : 3
method2(); // 입력매개변수 길이 : 0
}
public static void method1(int...values){
System.out.println("입력매개변수 길이 : " + values.length);
for (int i = 0; i < values.length; i++)
System.out.print(values[i] + " ");
System.out.println();
}
public static void method2(String...values){
System.out.println("입력매개변수 길이 : " + values.length);
for (int i = 0; i < values.length; i++)
System.out.print(values[i] + " ");
System.out.println();
}
}
method1(int... values)는 개수와 상관없이 정수를 입력을 받을 수 있고, method2(String... values)는 개수와 상관없이 문자열을 입력으로 받을 수 있다. 이 두 메서드를 호출할 때 입력매개변수로 각각 2개, 3개, 0개를 넘겼다. 오버로딩만 상관했다면 적어도 3개의 메서드 오버로딩을 수행해야 하고, 입력매개변수의 개수가 좀 더 다양하다면 그만큼 오버로딩을 더 많이 수행해야 한다. 하지만 가변 길이 배열 입력매개변수를 사용하면 단 1개의 메서드만 정의해 위의 모든 메서드 호출에 대응할 수 있게 된다. 대부분의 문법이 그렇듯이 메서드 오버로딩의 불편함을 덜고자 만들어진 문법이 가변 길이 배열 입력매개변수이고 사용하다보면 충분히 그런 불편함을 해소해 준다는 걸 느낄 수 있을 것이다.
public class jh {
public static void main(String[] args) {
// 가변 길이 int 배열 입력매개변수
method1(1, 2); // 입력매개변수 길이 : 2
method1(1, 2, 3); // 입력매개변수 길이 : 3
method1(); //입력매개변수 길이 : 0
// 가변 길이 String 배열 입력매개변수
method2("안녕", "방가"); // 입력매개변수 길이 : 2
method2("땡큐", "베리", "감사"); // 입력매개변수 길이 : 3
method2(); // 입력매개변수 길이 : 0
}
public static void method1(int... values) {
System.out.println("입력매개변수 길이 : " + values.length);
/*배열 출력 방법1
for (int i = 0; i < values.length; i++)
System.out.print(values[i] + " ");
System.out.println();
}*/
//배열 출력 방법2
for (int k : values) {
System.out.print(k + " ");
}
/*배열 출력 방법3
System.out.println(Arrays.toString(values));
*/
System.out.println();
}
public static void method2(String... values) {
System.out.println("입력매개변수 길이 : " + values.length);
/*배열 출력 방법1
for (int i = 0; i < values.length; i++)
System.out.print(values[i] + " ");
System.out.println();
}*/
//배열 출력 방법2
for (String k : values) {
System.out.print(k + " ");
}
/*배열 출력 방법3
System.out.println(Arrays.toString(values));
*/
System.out.println();
}
}
결과