반응형
Java 1.5부터 가변인자 메서드 var args가 추가되었다.
var args는 자료형의 인자를 0개 이상을 받을 수 있다.
동작원리
1. 클라이언트에서 전달한 인자 수에 맞는 배열이 자동 생성
2. 모든 인자가 해당 배열에 대입
3. 해당 배열이 메서드에 인자로 전달
var args의 간단한 사용 예
/**
*
* int인자를 받아서 그 합을 반환하는 varargs메서드.
* sum(1,2,3)과 같이 호출하면 6이
* 그리고 sum()과 같이 호출하면 0이 호출
*
* @author ismyeong
* @writeday 2018. 3. 14.
*
*/
static int sum(int... args) {
int sum = 0;
for(int arg : args) {
sum+=arg;
}
return sum;
}
하나 이상의 인자를 받아야 하는 var args 메서드를 잘못 구현한 사례
/**
*
* 인자 없이 메서드를 호출할 수 있다
* args의 유효성을 검사하는 코드를 명시적으로 넣어야 한다.
* 보기 좋지 않은 코드.
*
* @author ismyeong
* @writeday 2018. 3. 14.
*
*/
static int min(int... args) {
if(args.length == 0) {
throw new IllegalArgumentException("Too few arguments");
}
int min = args[0];
for(int i = 1 ; i < args.length ; i++) {
if(args[i] < min) {
min = args[i];
}
}
return min;
}
/**
*
* 하나 이상의 인자를 받는 var args 메서드를 제대로 구현한 예제
*
* @author ismyeong
* @writeday 2018. 3. 14.
*
*/
static int minGood(int firstArg, int... remainArgs) {
int min = firstArg;
for(int arg : remainArgs) {
if(arg < min) {
min = arg;
}
}
return min;
}
마지막 인자가 배열이라고 해서 무조건 뜯어 고칠 생각을 하지 말아야 한다.
varargs는 정말로 임의의 개수의 인자를 처리할 수 있는 메서드를 만들어야 할 때만 사용하라
성능이 중요한 환경이라면 varargs사용에 더욱 신중해야 한다.
varargs메서드를 호출할 때마다 배열이 만들어지고 초기화되기 때문이다.
가령 95% 정도는 메서드를 호출할 때 3개 이하의 인자가 전달된다고 생각하자.
오버로딩 메서드가 인자 개수가 3개 보다 클 경우 varargs를 사용한다.
그러면 5% 정도 호출에 대해서만 새로운 배열이 만들어 진다. (필요한 경우에만 사용하라는 말)
public void foo();
public void foo(int a1);
public void foo(int a1, int a2);
public void foo(int a1, int a2, int a3);
public void foo(int a1, int a2, int... rest);
결론
· var args메서드는 인자 개수가 가변적인 메서드를 정의할 때 편리 하지만, 남용되면 곤란하다.
· 부적정하게 사용되면 혼란스러운 결과를 초래할 수 있다.
반응형
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 40 메서드 시그너처는 신중하게 설계하라 (0) | 2023.04.27 |
---|---|
<Effective Java> RULE 41 오버로딩할 때는 주의하라 (0) | 2023.04.26 |
<Effective Java> RULE 43 null 대신 빈 배열이나 컬렉션을 반환하라 (0) | 2023.04.26 |
<Effective Java> RULE 44 모든 API요소에 문서화 주석을 달라 (0) | 2023.04.26 |
<Effective Java> RULE 45 지역 변수의 유효범위를 최소화하라 (0) | 2023.04.26 |