기존에는 메소드의 매개변수 개수가 고정적이었으나, JDK1.5부터 동적으로 지정할 수 있으며
이를 '가변인자(variable arguments)' 라고 한다.
선언 방법
'타입... 변수명'
class Test {
static String something(String... args) {
// to be
}
}
만약 여러 문자열을 하나로 결합하여 반환하는 make 메소드를 작성한다면, 아래와 같이 매개변수의 개수를 다르게 해서
여러 개의 메소드를 작성해야할 것이다.
String make(String s1, String s2) { ... }
String make(String s1, String s2, String s3) { ... }
String make(String s1, String s2, String s3, String s4) { ... }
이럴 때, 가변인자를 사용하면 메서드 하나로 간단히 대체할 수 있다.
String make(String...str) { ... }
가변인자는 내부적으로 배열을 이용하므로 가변인자가 선언된 메소드를 호출할 때마다 배열이 새로 생성된다.
가변인자가 편리하지만, 비효율이 숨어있으므로 꼭 필요한 경우에만 가변인자를 사용하자.
가변인자를 오버로딩할 때 주의할 점
public class VarArgsEx {
public static void main(String[] args) {
String[] strArr = {"100", "200", "300"};
System.out.println(concatenate("", "100", "200", "300"));
System.out.println(concatenate("-", strArr));
System.out.println(concatenate(",", new String[] {"1", "2", "3"}));
}
static String concatenate(String delim, String...args){
String result = "";
for(String str : args) {
result += str + delim;
}
return result;
}
/*
static String concatenate(String...args) {
return concatenate("", args);
}
*/
}
아래의 String concatenate(String...args) 메소드는 주석처리를 해놓앗다.
주석처리된 메소드와 String concatenate(String...args) 메소드는 별 문제가 없어 보이지만 아래 메소드를
주석을 해제할 경우 에러가 발생한다.
두 오버로딩된 메소드가 구분되지 않기 때문이다. 메소드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다. 가능하면 가변인자를 사용한 메소드는 오버로딩하지 않는 것이 좋다.
출처 : JAVA의 정석 남궁 성 지음
'공부 > Java' 카테고리의 다른 글
클래스 메소드(static 메소드)와 인스턴스 메소드 (0) | 2022.06.12 |
---|---|
인스턴스 변수와 클래스 변수 (0) | 2022.06.12 |
JUnit을 이용한 단위 테스트와 Assert 메소드 (0) | 2022.03.31 |