본문 바로가기
Language/Java

[JAVA] 가변 인자(Varargs)란 무엇인가요? 유연한 메소드 설계의 핵심

by Papa Martino V 2026. 1. 25.
728x90

가변 인자(Varargs)
가변 인자(Varargs)

 

자바 프로그래밍을 하다 보면 동일한 로직을 처리하면서도 입력받는 파라미터의 개수가 매번 달라지는 상황을 마주하게 됩니다. 과거에는 이를 해결하기 위해 배열을 직접 생성해 넘기거나, 인자 개수별로 수많은 메소드 오버로딩(Overloading)을 구현해야 했습니다. 이러한 번거로움을 해결하기 위해 Java 5에서 등장한 혁신적인 기능이 바로 가변 인자(Varargs)입니다. 오늘은 가변 인자의 개념부터 내부 동작 원리, 그리고 실무 사용 시 반드시 주의해야 할 점까지 심층적으로 살펴보겠습니다.

1. 가변 인자(Varargs)의 정의와 선언 방법

가변 인자는 'Variable Arguments'의 줄임말로, 메소드의 매개변수 개수를 동적으로 조절할 수 있게 해주는 기능입니다. 선언 방식은 매우 간단합니다. 타입 뒤에 마침표 세 개(...)를 붙여주면 됩니다.

  • 문법: public void printNumbers(int... numbers) { ... }
  • 동작 방식: 가변 인자로 전달된 값들은 메소드 내부에서 배열로 취급됩니다.
  • 호출 유연성: 인자를 0개 전달하거나, 여러 개 전달하거나, 심지어 배열을 그대로 전달해도 모두 수용합니다.

2. 가변 인자 vs 배열 vs 오버로딩 비교

유사한 목적을 가진 다른 방식들과 가변 인자의 차이점을 한눈에 파악해 보세요.

비교 항목 메소드 오버로딩 배열 매개변수 가변 인자 (Varargs)
코드 간결성 낮음 (개수별로 선언) 보통 (배열 생성 필요) 매우 높음
인자 개수 제한 고정됨 제한 없음 제한 없음
호출부 편의성 보통 낮음 (new 연산자 필수) 매우 높음 (값만 나열)
인자 0개 호출 별도 선언 필요 빈 배열 생성 필요 가능

3. 가변 인자 사용 시의 핵심 규칙 (Constraint)

가변 인자는 편리하지만, 컴파일러가 인자의 끝을 명확히 구분할 수 있도록 두 가지 엄격한 규칙을 준수해야 합니다.

  1. 마지막 위치 선언: 가변 인자는 메소드 파라미터 중 반드시 가장 마지막에 선언되어야 합니다.
  2. 단 한 번만 사용: 하나의 메소드에 가변 인자는 오직 한 개만 포함될 수 있습니다.
// 잘못된 예시 (컴파일 에러 발생)
public void errorMethod(String... names, int age) { } // 가변 인자가 마지막이 아님
public void errorMethod(int... nums, String... strs) { } // 가변 인자가 두 개임
    

4. Sample Example: 가변 인자 활용 실무 코드

다양한 개수의 숫자를 합산하는 로직을 가변 인자로 구현한 예제입니다.

public class VarargsExample {
    public static void main(String[] args) {
        // 인자의 개수에 상관없이 동일한 메소드 호출 가능
        System.out.println("합계 1: " + sum());              // 0개
        System.out.println("합계 2: " + sum(10, 20));       // 2개
        System.out.println("합계 3: " + sum(1, 2, 3, 4, 5)); // 5개
    }

    public static int sum(int... values) {
        int total = 0;
        // 내부적으로는 values를 배열로 인식하여 향상된 for문 사용 가능
        for (int v : values) {
            total += v;
        }
        return total;
    }
}
    

5. 가변 인자 사용 시 주의사항 (Best Practice)

1) 성능 고려

가변 인자 메소드는 호출될 때마다 새로운 배열을 생성합니다. 만약 성능이 매우 중요한 루프 안에서 빈번하게 호출된다면, 성능 저하의 원인이 될 수 있습니다. 이 경우 자주 사용되는 인자 개수(예: 1~3개)에 대해서는 오버로딩을 제공하는 것이 좋습니다.

2) 오버로딩 혼선

가변 인자를 포함한 메소드를 오버로딩하면, 컴파일러가 어떤 메소드를 호출해야 할지 모호한 상황(Ambiguous)이 발생할 수 있습니다. 가변 인자를 사용하는 메소드는 가급적 오버로딩하지 않는 것이 클린 코드의 원칙입니다.

결론

Java의 가변 인자는 메소드 설계 시 유연성을 극대화해주는 훌륭한 도구입니다. String.format()이나 Arrays.asList() 같은 자바 표준 라이브러리에서도 널리 쓰이는 만큼, 정확한 사용법을 익히는 것이 중요합니다. 다만, 내부적으로 배열이 생성된다는 점과 선언 순서의 제약을 항상 염두에 두고 활용하시기 바랍니다.


정보 출처

  • Oracle Java Documentation - Arbitrary Number of Arguments: Official Guide
  • Effective Java 3rd Edition (Joshua Bloch 저) - Item 53: Use varargs judiciously
  • Java Language Specification - Section 8.4.1 (Formal Parameters): JLS SE 17
728x90