자바

가변인자와 배열인자

Blue_bull 2025. 2. 8. 23:55

📌 가변 인자(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를 쓰는 것이 더 편리하지만, 성능이 중요하거나 배열을 여러 개 다뤄야 할 경우 배열을 직접 사용하는 것이 더 적절합니다!