가변 인자 (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 |