Post

Varargs 가변인자

Varargs 가변인자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class VarargsRules {
    // OK - 가변 인자는 마지막에
    void method1(String name, int... scores) { }

    // 컴파일 에러! 가변 인자 뒤에 다른 매개변수 불가
    // void method2(int... scores, String name) { }

    // 컴파일 에러! 가변 인자는 하나만
    // void method3(int... a, String... b) { }

    // OK - 배열로 전달 가능
    void method4(int[] scores) { }
}

가변 인자가 배열로 처리되기 때문

가변 인자(Varargs)란?

1
void method1(int... scores) { }
  • 이건 실제로 컴파일되면 내부적으로
1
void method1(int[] scores) { }

로 바뀜. 즉, 가변 인자는 사실상 배열 매개변수와 같다.

호출 시:

1
method1(10, 20, 30);

이건 결국 컴파일러가 알아서

1
method1(new int[]{10, 20, 30});

로 바꿔주는 것.

그런데 문제는 가변 인자 뒤에 다른 매개변수를 두면 모호해진다

예를 들어 아래처럼 쓰면:

1
void method2(int... scores, String name) { } // ❌ 컴파일 에러

이걸 호출할 때,

1
method2(10, 20, 30, "Kim");

자바 컴파일러는 헷갈린다

  • “Kim”을 scores 배열의 일부로 넣어야 하나?

  • 아니면 “Kim”이 뒤의 name으로 가야 하나?

경계가 모호하기 때문에 자바는 아예 이런 형태를 금지시킨 것

그래서 규칙이 생김:

가변 인자(…) 는 반드시 매개변수 목록의 마지막에만 올 수 있다.

올바른 형태

1
void method1(String name, int... scores) { }

호출 시:

1
method1("Kim", 90, 80, 70);
  • → 첫 번째 인자는 name
  • → 나머지(90,80,70)는 전부 scores 배열에 자동으로 묶임.
This post is licensed under CC BY 4.0 by the author.