본문 바로가기
스터디/Java

[Java 자바] '...' 가변인자(Varargs)

by dingwoon 2024. 11. 21.

1 필요성

함수의 매개변수로 정해진 수가 아니라 가변 개수의 인자를 받아야 하는 경우가 있다.
이때 '...'을 사용하면 함수에서 받을 매개변수의 수를 미리 정하지 않아도 된다.

2 문법

void test(int... test)

위와 같이 함수의 매개변수 타입 뒤에 '...'을 붙이면 된다.

  • 특징
    • 이렇게 받은 매개변수는 함수 내에서 배열로 처리된다.
    • 메서드의 가변인자는 하나만 가능하고 마지막 매개변수만 가능하다.
    • 값을 전달하지 않을 수도 있고, 1개 이상 여러개를 전달할 수도 있다.

3 예시

public class Main {
    public static void main(String[] args) {
        test(1, 2, 3);
    }

    public static void test(int... test) {
        System.out.println("class name: " + test.getClass());
        System.out.println("length: " + test.length);
    }
}

위의 예시를 실행하면 아래의 결과가 나온다.

class name: class [I
length: 3

매개변수의 클래스를 보면 배열임을 확인할 수 있다.
또한 배열의 길이는 함수를 호출할 때 해당 가변인자로 넘겨준 인자의 수와 같다.
만약 아무것도 입력하지 않으면 길이는 0이 된다.

public class Main {
    public static void main(String[] args) {
        test(new int[]{1,2,3});
    }

    public static void test(int... test) {
        System.out.println("class name: " + test.getClass());
        System.out.println("length: " + test.length);
    }
}

함수 호출 시에 가변인자들을 넘길 때 컴파일러에서 배열로 변화을 해서 함수로 넘긴다. 그래서 함수를 호출할 때 가변인자를 나열하는 것 대신 배열을 입력할 수도 있다.

4 주의점

  • 주의1

      public class Main {
          public static void main(String[] args) {
              test(1, 2, 3, 3.3);
          }
    
          public static void test(int... test) {
              System.out.println("class name: " + test.getClass());
              System.out.println("length: " + test.length);
          }
      }

    위 처럼 int를 받을 때 3.3같이 int가 아닌 다른 값을 넣으면 컴파일 에러가 발생한다.

  • 주의2

      public static void test(int... numbers, String name) { } // 컴파일 에러
      public static void test(String name, int... numbers) { } // 정상

    가변인자가 마지막이 아닐 경우 컴파일 에러가 발생한다.

  • 주의3
    너무 많은 인자를 전달할 경우 stack overflow가 발생할 수 있다.