공부/Java

가변인자(varargs)와 오버로딩

동곤영 2022. 6. 12. 17:11

기존에는 메소드의  매개변수 개수가 고정적이었으나, 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의 정석 남궁 성 지음