[Java] 가변인자(varargs, 쩜쩜쩜) 사용법 (매개변수 동적 사용)
가변인자란, 하나의 함수에서 매개변수를 동적으로 받을수 있는 방법. 메서드의 매개변수 개수를 동적으로 지정해주는 방법이다.
'타입… 변수명' 형식으로 선언할 수 있고, 예시로 PrintStream Class의 printf()가 있다.
public PrintStream printf(String format, Object ...args) { ... }
가변인자와 비슷한 방법으로 오버로딩이 있지만, 오버로딩은 다음과같이 함수 정의를 여러개 해야하고
public class test {
public static void main(String[] args) {
test t = new test();
t.variable("A");
t.variable("A","B");
t.variable("A","B","C");
}
public void variable(String s) {
System.out.println(s);
}
public void variable(String s, String ss) {
System.out.println(s);
System.out.println(ss);
}
[ ... ]
미리 정의한 매개변수보다 많거나 적은 매개변수를 넘길 수 없다.
t.variable("A", "B", "c"); <- Error!
가변인자 문법
가변인자는 가변인자를 나타내는 기호 "..." 쩜쩜쩜을 사용한다. 변수 타입뒤에 붙여주고 변수명을 쓰면 된다.
public class test {
public static void main(String[] args) {
test t = new test();
t.variable();
t.variable("A");
t.variable("A","B");
t.variable("A","B","C");
}
public void variable(String... s) {
System.out.println(Arrays.toString(s));
}
}
가변인자는 전달인자를 0개부터 n개까지 넣을수 있다. 가변인자는 컴파일시 배열로 처리되기때문에 사용할때 위 코드처럼 Arrays.toString() 으로 빼줘야 한다. (0개나 1개도)
가변인자 문법 주의
1. 가변인자는 매개변수 중 제일 마지막에 사용해야 한다. 가변인자 외에도 매개변수가 더 있을 때, 가변인자가 앞에 있다면 가변인자가 아닌 매개변수와 구별을 할 수 있는 방법이 없기 때문에 이를 허용하지 않는다. 가변인자를 매개변수 앞에 선언하면 다음처럼 컴파일 에러가 발생한다.
java: varargs parameter must be the last parameter
2. 가변인자 메서드는 오버로딩 시 주의해야한다.
가변인자는 내부적으로 배열을 이용하기 때문에 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. 가변인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 구별되지 못하는 경우 애매한 경우가 발생하기 쉽기 때문에 주의 해야한다.
Error: java: reference to concatenate is ambiguous both method...
가능하다면 가변인자를 사용한 메서드는 오버로딩을 하지 않는 것이 바람직하다.