[Java] Varargs란 무엇인가
vararg란 무엇인가
What is varargs in Java?
자바 메소드를 하나 만든다고 가정하자. 하지만, 우리는 이 메소드가 받아들이고자 하는 인자가 얼마나 많을지 장담할 수 없다. 이를 해결하기 위해, Java 1.5 버전에서 varargs를 도입했다.
Varargs는 variable arguments의 준말이다. 자바에서, 메소드의 인자는 임의의 value 개수를 받을 수 있다. 이렇게 value의 변수 개수를 받는 인자를 varargs라고 한다.
accessModifier methodName(datatype... arg) {
// method body
}
varargs를 정의하기 위해, …
(점 세 개)가 메소드의 파라미터로 사용된다. 인자의 변수 개수를 받는 메소드를 variable-arity method 혹은 varargs method라고 한다.
예시
varargs를 쓰지 않은 예시
class NoVararg {
public int sumNumber(int a, int b){
return a+b;
}
public int sumNumber(int a, int b, int c){
return a+b+c;
}
public static void main( String[] args ) {
NoVararg obj = new NoVararg();
System.out.println(obj.sumNumber(1, 2));
System.out.println(obj.sumNumber(1, 2, 3));
}
}
// Output
3
6
만약 varargs를 쓰지 않으면 sumNumber
메소드에 오버라이딩을 계속해서 해줘야 한다. 여기서 만약 인자가 5개라면? 100개라면? 그것도 일일이 다 써줘야 할텐데..개불편.
아래는 varargs
를 쓴 클래스이다. 여기서 메소드는 오직 딱 한 번만 쓰인 것을 알 수 있다. for문으로 인자를 다 받아오니 인자 수를 신경쓸 필요가 없다.
class VarargExample {
public int sumNumber(int ... args){
System.out.println("argument length: " + args.length);
int sum = 0;
for(int x: args){
sum += x;
}
return sum;
}
public static void main( String[] args ) {
VarargExample ex = new VarargExample();
int sum2 = ex.sumNumber(2, 4);
System.out.println("sum2 = " + sum2);
int sum3 = ex.sumNumber(1, 3, 5);
System.out.println("sum3 = " + sum3);
int sum4 = ex.sumNumber(1, 3, 5, 7);
System.out.println("sum4 = " + sum4);
}
}
다른 예제를 보자. 문자열 포매팅 함수 format()에서도 varargs가 쓰인다.
public static String format(Locale l, String format, Object... args) {
// body
}
class Company {
public static void main(String[] args) {
String siteName = "programiz.com";
int empCount = 6;
String type = "tutorial website";
System.out.println(
String.format(
"Site Name : %s, Emp Count: %d Type: %s",
siteName, empCount, type
)
);
}
}
Output:
Site Name : programiz.com, Emp Count: 6 Type: tutorial website
varargs는 뒤에서 어떻게 돌아가고 있는 걸까?
public int sumNumber(int ... nums) {
// method body
}
…
구문은 자바 컴파일러에게 이 메소드는 0개 이상의 인자로 호출될 수 있다고 알려준다. 결과적으로, nums
변수는 int[]
타입의 배열로 암묵적으로 선언된다. 따라서, 메소드 안에서 num 변수는 array 구문을 사용해 접근한다. 만약 어떤 인자도 없다면, nums
의 길이는 0이 된다.