📌 가변 인자(varargs
)와 배열(array
)의 차이점
가변 인자와 배열은 모두 여러 개의 값을 받을 수 있지만, 사용법과 동작 방식에 차이가 있습니다.
1️⃣ 가변 인자 (varargs
)
✅ 특징
타입... 변수명
형태로 사용 (Object... values
)- 호출할 때 인자의 개수를 자유롭게 조절 가능
- 내부적으로 배열(
T[]
)로 변환되어 사용됨 - 배열을 직접 생성할 필요 없음
- 한 메서드에서 가변 인자는 하나만 사용 가능하며, 반드시 마지막 매개변수로 위치해야 함
✅ 예제 (가변 인자)
public class Test {
public static void printValues(String title, Object... values) { // 가변 인자 사용
System.out.println("Title: " + title);
for (Object value : values) {
System.out.println(value);
}
}
public static void main(String[] args) {
printValues("Test 1", 1, "Hello", 3.14); // 다양한 개수와 타입의 인자 전달 가능
printValues("Test 2", "Java", "Python"); // 개수 제한 없음
printValues("Test 3"); // 가변 인자 없이 호출 가능
}
}
📌 장점
- 가변적인 개수의 인자를 처리할 때 유용
- 배열을 직접 만들 필요 없이 편리하게 여러 개의 값을 전달 가능
- 코드 가독성이 높고 사용하기 편리함
📌 단점
- 내부적으로 배열로 변환되므로 약간의 성능 오버헤드가 있을 수 있음
- 가변 인자는 한 개만 사용할 수 있으며, 반드시 마지막 매개변수로 위치해야 함
public static void test(int... numbers, String text) { } // ❌ 오류 (가변 인자는 마지막이어야 함) public static void test(String text, int... numbers) { } // ✅ 올바른 사용
📌 적절한 사용법
- 메서드가 다양한 개수의 인자를 받아야 할 때
- 인자의 개수가 유동적인 경우
- 배열을 직접 만들 필요 없이 간편하게 처리하고 싶을 때
2️⃣ 배열 (array
)
✅ 특징
T[] 변수명
형태로 사용 (Object[] values
)- 호출할 때 반드시 배열을 직접 생성해야 함
- 이미 배열이 있는 경우 직접 전달할 수 있음
- 다른 매개변수들과 함께 자유롭게 사용 가능
✅ 예제 (배열)
public class Test {
public static void printValues(String title, Object[] values) { // 배열 사용
System.out.println("Title: " + title);
for (Object value : values) {
System.out.println(value);
}
}
public static void main(String[] args) {
Object[] arr1 = {1, "Hello", 3.14};
printValues("Test 1", arr1); // ✅ 배열을 직접 전달해야 함
Object[] arr2 = {"Java", "Python"};
printValues("Test 2", arr2); // ✅ 배열을 만들어서 전달해야 함
printValues("Test 3", new Object[]{}); // ✅ 빈 배열 전달 가능
}
}
📌 장점
- 배열이 이미 존재하는 경우 바로 전달 가능
- 메모리를 효율적으로 사용할 수 있음 (불필요한 배열 변환 없음)
- 여러 개의 배열을 인자로 받을 수 있음 (가변 인자는 하나만 가능)
📌 단점
- 매개변수로 전달할 때 항상 배열을 생성해야 함
- 호출하는 쪽에서 배열을 직접 만들 필요가 있어 불편
- 인자 개수가 유동적이지 않음 (고정된 배열만 받을 수 있음)
📌 적절한 사용법
- 이미 배열이 존재하는 경우
- 배열을 가공해서 전달해야 하는 경우
- 메모리 효율이 중요한 경우 (불필요한 변환을 줄이기 위해)
🚀 차이점 정리
특징 | 가변 인자 (varargs ) |
배열 (array ) |
---|---|---|
선언 방식 | 타입... 변수명 |
타입[] 변수명 |
호출 시 배열 생성 필요 여부 | ❌ 필요 없음 | ✅ 필요함 |
인자 개수 | 자유롭게 조절 가능 | 고정된 배열만 전달 가능 |
성능 | 내부적으로 배열 변환(약간의 오버헤드) | 직접 배열 사용(더 최적화됨) |
여러 개 사용 가능 여부 | ❌ 오직 하나만, 마지막에 위치해야 함 | ✅ 여러 개 사용 가능 |
사용 편의성 | ✅ 매우 편리함 | ❌ 매번 배열을 만들어야 해서 불편 |
추천 사용 사례 | 인자의 개수가 유동적인 경우 | 이미 배열이 존재하는 경우 |
📌 결론 및 사용 추천
✅ 가변 인자(varargs
)를 쓰는 것이 좋은 경우
- 인자의 개수가 유동적인 경우
- 배열을 직접 만들 필요 없이 간편하게 처리하고 싶을 때
- 예:
printNumbers(int... numbers)
,logMessages(String... messages)
public static void logMessages(String... messages) {
for (String msg : messages) {
System.out.println(msg);
}
}
logMessages("Error", "Warning", "Info"); // 인자 개수 유동적
✅ 배열(array
)을 쓰는 것이 좋은 경우
- 이미 배열이 존재하는 경우
- 불필요한 배열 변환 없이 성능을 최적화해야 할 때
- 여러 개의 배열을 받을 필요가 있을 때
public static void processArrays(String[] arr1, int[] arr2) {
for (String s : arr1) System.out.println(s);
for (int num : arr2) System.out.println(num);
}
processArrays(new String[]{"A", "B"}, new int[]{1, 2, 3}); // 여러 개의 배열 전달 가능
🎯 최종 결론
✔ 가변 인자 (varargs
):
👉 인자의 개수가 유동적인 경우, 호출이 편리해야 할 때 추천
✔ 배열 (array
):
👉 이미 배열이 있는 경우, 여러 개의 배열을 전달해야 할 때 추천
🚀 일반적으로 varargs
를 쓰는 것이 더 편리하지만, 성능이 중요하거나 배열을 여러 개 다뤄야 할 경우 배열을 직접 사용하는 것이 더 적절합니다!
'자바' 카테고리의 다른 글
매개변수가 없는 메서드와 매개변수가 없는 생성자 비교를 통한 생성자 이해 (0) | 2025.02.08 |
---|---|
final 키워드 특징 (0) | 2025.02.08 |
null이란? (0) | 2025.02.08 |
잘못된 메서드 사용 예시 (0) | 2025.02.08 |
동기 처리와 비동기 처리 (1) | 2025.02.07 |