가변 인자 매개변수
길이가 가변적인 인자 목록을 받는 메서드를 정의하고 배열과 결합합니다.
가변 인자 매개변수은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
가변 인수 매개변수
가변 인수(가변 길이 인수 목록)를 사용하면 같은 형식의 인수를 개수 제한 없이 받는 메서드를 정의할 수 있으며, 내부적으로는 배열로 처리됩니다.
가변 인수 선언
가변 인수 매개변수에는 Type... name을 사용합니다. 반드시 마지막 매개변수여야 하며 메서드마다 하나만 사용할 수 있습니다.
static int sum(int... numbers) {
int total = 0;
for (int n : numbers) total += n;
return total;
}
System.out.println(sum()); // 0 (empty array)
System.out.println(sum(1)); // 1
System.out.println(sum(1, 2, 3)); // 6
System.out.println(sum(1, 2, 3, 4)); // 10
// Can also pass an array
int[] arr = {5, 10, 15};
System.out.println(sum(arr)); // 30가변 인수의 내부 동작
가변 인수는 문법적 편의 기능입니다. 컴파일러는 호출 지점에서 호출을 배열 생성으로 변환합니다.
// Calling: sum(1, 2, 3)
// Compiler generates: sum(new int[]{1, 2, 3})
static void printAll(String label, String... items) {
System.out.println(label + ":");
for (String item : items) System.out.println(" - " + item);
}
printAll("Fruits", "Apple", "Banana", "Cherry");
// Fruits:
// - Apple
// - Banana
// - Cherry
printAll("Empty"); // varargs is empty array가변 인수와 일반 매개변수 혼합
가변 인수는 반드시 마지막 매개변수여야 합니다. 그 앞에 일반 매개변수를 함께 사용할 수 있습니다.
static double average(String label, double... values) {
if (values.length == 0) return 0.0;
double sum = 0;
for (double v : values) sum += v;
double avg = sum / values.length;
System.out.printf("%s average: %.2f%n", label, avg);
return avg;
}
average("Math scores", 92.0, 85.5, 78.0, 95.0);
// Math scores average: 87.62
average("Single value", 100.0);
// Single value average: 100.00제네릭 형식과 가변 인수
제네릭과 가변 인수를 함께 사용하면 힙 오염 경고가 발생합니다. 메서드가 안전하다는 것을 증명할 수 있을 때는 @SafeVarargs로 경고를 억제합니다.
import java.util.Arrays;
import java.util.List;
@SafeVarargs // suppresses heap pollution warning
static <T> List<T> listOf(T... elements) {
return Arrays.asList(elements); // safe: we don't store to the array
}
List<String> names = listOf("Alice", "Bob", "Charlie");
System.out.println(names); // [Alice, Bob, Charlie]
List<Integer> scores = listOf(95, 87, 73);
System.out.println(scores); // [95, 87, 73]가변 인수와 오버로딩
가변 인수 메서드가 정확히 일치하는 메서드와 함께 오버로드되어 있으면 정확히 일치하는 메서드가 우선됩니다. 가변 인수는 최후의 수단입니다.
static void log(String msg) { System.out.println("1-arg: " + msg); }
static void log(String m1, String m2) { System.out.println("2-arg: " + m1 + ", " + m2); }
static void log(String... msgs) { System.out.println("varargs: " + msgs.length); }
log("hello"); // 1-arg: hello
log("a", "b"); // 2-arg: a, b
log("a", "b", "c"); // varargs: 3
log(); // varargs: 0printf는 가변 인수입니다
System.out.printf는 가변 인수를 사용하므로 형식 문자열과 형식에 관계없이 원하는 개수의 인수를 받을 수 있습니다.
// printf signature: printf(String format, Object... args)
System.out.printf("%s ordered %d items for $%.2f%n",
"Alice", 3, 59.97);
// Alice ordered 3 items for $59.97
// String.format is also varargs
String msg = String.format("Error %d: %s", 404, "Not Found");
System.out.println(msg); // Error 404: Not Found가변 인수를 사용한 로거 만들기
가변 인수를 사용하여 키-값 쌍을 받는 간단한 구조화 로거를 구현합니다.
static void logEvent(String event, Object... keyValues) {
if (keyValues.length % 2 != 0)
throw new IllegalArgumentException("Key-value pairs required");
StringBuilder sb = new StringBuilder(event);
for (int i = 0; i < keyValues.length; i += 2)
sb.append(" ").append(keyValues[i]).append("=").append(keyValues[i+1]);
System.out.println(sb);
}
logEvent("user.login", "userId", 42, "ip", "192.168.1.1", "success", true);
// user.login userId=42 ip=192.168.1.1 success=true성능 고려 사항
가변 인수를 호출할 때마다 힙에 새 배열이 생성됩니다. 호출 빈도가 높은 유틸리티 메서드에는 할당을 피할 수 있도록 고정 개수 매개변수 오버로드를 제공하세요.
// Java's own EnumSet does this:
static <E extends Enum<E>> EnumSet<E> of(E e) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E... rest) { ... }
// Avoids array creation for 1-3 args (most common case)
// Apply the same pattern to your own hot-path APIs:
static void report(String msg) { log(new String[]{msg}); }
static void report(String m1, String m2) { log(new String[]{m1, m2}); }
static void report(String... msgs) { log(msgs); }가변 인수와 null
가변 인수 메서드에 null을 전달하면 모호해집니다 — Java가 이를 널 배열로 해석할 수 있습니다. 경고를 피하려면 명시적 형 변환을 사용하세요.
static void printItems(String... items) {
if (items == null) {
System.out.println("null array passed");
return;
}
for (String item : items)
System.out.println(item != null ? item : "(null element)");
}
printItems((String[]) null); // null array passed
printItems(null, "valid"); // (null element), valid
printItems(); // empty array (0 items)실습: String 형식 지정 도우미
형식-인수 방식에 맞추기 위해 가변 인수를 사용하는 안전한 printf 래퍼로, 형식이 적용된 문자열을 반환합니다.
static String fmt(String pattern, Object... args) {
try {
return String.format(pattern, args);
} catch (java.util.IllegalFormatException e) {
return "[FORMAT ERROR: " + e.getMessage() + "]";
}
}
System.out.println(fmt("User %s has %d orders", "Alice", 5));
// User Alice has 5 orders
System.out.println(fmt("Invalid %z format", "arg"));
// [FORMAT ERROR: Conversion = 'z' ...]빠른 확인
메서드 본문 안에서 가변 인수 매개변수의 형식은 무엇입니까?
복습: 가변 인수 매개변수
핵심 정리:
- 가변 인수(Type... name)는 내부적으로 배열로 처리되며 인수를 0개 이상 받습니다
- 반드시 마지막 매개변수여야 하며 메서드마다 가변 인수 매개변수는 하나만 사용할 수 있습니다
- 호출자는 개별 값이나 배열을 전달할 수 있습니다
- 제네릭 가변 인수의 힙 오염 경고를 억제하려면 @SafeVarargs를 사용합니다
- 정확히 일치하는 오버로드가 가변 인수 오버로드보다 우선됩니다
- 배열 할당을 피하려면 자주 호출되는 메서드에 고정 개수 매개변수 오버로드를 제공하세요
자주 묻는 질문
“가변 인자 매개변수” 강의는 무료인가요?
네 — “가변 인자 매개변수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“가변 인자 매개변수”에서 뭘 배우나요?
길이가 가변적인 인자 목록을 받는 메서드를 정의하고 배열과 결합합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“가변 인자 매개변수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 메서드 오버로딩 규칙
- 가변 인자 매개변수
- 정적 필드와 상수
- 유틸리티 클래스와 정적 팩터리 메서드