Java/문법

가변 인자 (...)

가지코딩 2025. 4. 29. 15:56

가변 인자 (Varargs, Variable Argument ) 란?

  • 메서드를 호출할 때 인자의 개수를 유동적으로 받을 수 있도록 해주는 Java 문법
  • 가변 인자를 사용하면 하나의 인자로 여러 개의 인자를 받을 수 있다.
public void printNames(String... names) {
    for (String name : names) {
        System.out.println(name);
    }
}
print();                                // 아무 것도 출력 안 됨
print("Hello");                         // Hello
print("Hello", "World", "Java");        // Hello / World / Java

가변인자를 사용하는 상황

  • 인자의 개수가 정해지지 않았을 때
  • 비슷한 기능을 가진 메서드 오버로딩을 줄이고 싶을 때
  • Java 라이브러리에서도 자주 쓰임 (예: String.format, Arrays.asList)

문법

  • 타입... 변수명... 은 "여러 개의 인자를 받을 수 있음"을 의미한다.
  • 내부적으로는 배열처럼 처리된다.
리턴타입 메서드명(타입... 변수명) {
    // 내부에서는 변수명이 배열처럼 작동한다.
}
public int sum(int... numbers) {
    int total = 0;
    for (int num : numbers) {
        total += num;
    }
    return total;
}

// sum(1, 2, 3) 호출 시
// int[] nums = {1, 2, 3} 으로 변환된다.

 

 

내부 동작

  • int... nums는 컴파일 시 int[] nums로 바뀐다.
  • 즉, 가변 인자 = 배열 문법의 축약형
  • 호출 시 컴파일러가 알아서 배열을 생성해서 넘겨준다.
sum(1, 2, 3);          // → sum(new int[]{1, 2, 3});

주의할 점

  • 메서드에 가변인자는 한 번만 사용가능하다.
  • 반드시 매개변수 목록의 마지막에 위치해야 한다.
// 잘못된 예시
void test(String... names, int... age) { ... }	// ❌ 한 번만 사용가능
void test(String... names, int age) { ... } 	// ❌ 마지막 위치에만 사용 가능

 

  • 가변인자는 오버로딩(overloading) 시 충돌 위험이 있다.
public void print(String... texts) {}
public void print(String text) {}       // 모호성 발생 가능!

실제 사용 예

String.format()

public static String format(String format, Object... args)
String result = String.format("Hi %s, you have %d messages", "Alice", 5);

 

 

Arrays.asList()

public static <T> List<T> asList(T... a)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

'Java > 문법' 카테고리의 다른 글

가변 리스트 vs 불변 리스트  (1) 2025.04.29
Map - compute(), computeIfAbsent(), computeIfPresent()  (0) 2025.04.29
String.split() 문자열 자르기, 나누기  (0) 2025.04.22
어노테이션(Annotation)  (0) 2025.04.21
Enum 열거형 타입  (0) 2025.04.21