Java

[Java] Varargs란 무엇인가

Woonys 2022. 5. 26. 11:09
반응형

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이 된다.

Reference

[https://www.programiz.com/java-programming/varargs]

반응형