본문 바로가기

개발언어/Java _ Spring

[Java]가변인자(varargs)을 왜 쓰는거지? 쉬운 이해와 활용

가변인자(varargs) ...String

 

 

0 .개요

가변인자는 메서드의 매개변수를 동적으로 처리할 수 있도록 해준다.

이를 사용하면 메서드 호출 시 전달되는 인자의 개수를 동적으로 변경할 수 있다.

public void exampleMethod(String... strings) {
    // 가변인자로 선언된 문자열 배열에 대한 처리
    // strings는 문자열 배열로 처리됨
}

위의 exampleMethod() 메서드에 'String...'은 가변인자를 나타내는 문법이다.

string이라는 문자열 배열이 선언되고 메서드가 호출될 때 넘겨받은 인자들이 이 배열로 묶어 처리된다. 

 

메서드를 호출하고자 할때 인수의 갯수가 가변적일 때 가변인수를 처리하면 손 쉽게 처리할 수 있다.

 

또한 가변인자는 다른 인자와 함께 사용할 수 있다. 

예를들어 고정적인 String타입의 인수 하나와, 가변적인 String타입의 인수가 여러개 있다고 가정했을 때 

public void exampleMethod(String prefix, String... strings) {
    // 가변인자로 선언된 문자열 배열에 대한 처리
    // prefix와 함께 처리됨
}

위 메소드를 exampleMethod("fruits: ", "apple", "banana", "cherry")와 같이 호출하면,

prefix는 "fruits: "가 되고, strings는 {"apple", "banana", "cherry"}가 된다.

 

 

1.사용가능한 자료형
  • 배열을 포함한 모든 참조자료형 (String, Object, List, Map, Inteager .. ) 등 모든 객체형 자료형이 가변인자로 사용가능
  • 반면, 기본 자료형은 가변인자로서 사용할 수 없다.
  • 기본자료형을 가변인자로 사용하기 위해서는 래퍼 클래스(wrapper class)를 이용해야한다.
    예를들어
    int대신 Inteager
    float, double 대신 Double
    boolean 대신 Boolean 등을 사용할 수 있다.
 2. 활용

그렇다면, 가변인자를 사용하는 이유는 무엇일까?

String을 여러개 매개변수로 넣으려면 List형태를 활용하면 되지 않을까? (심지어, 같은 for문을 사용하는데도 말이다.)

 

List를 활용해도 동일한 기능을 구현할 수 있다. 다만 가변인자('...')를 사용하면 인자의 개수가 가변적일때 간단하게 처리할 수 있다는 장점이 있다. 

예를들어 다음과 같은 메서드가 있다고 가정해보자

public void printArgs(String... args) {

    for (String arg : args) {
        System.out.println(arg);
    }
}


public void printArgs(List<String> args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

두 메서드는 매개변수의 타입외에는 차이가 없고, 기능적으로 동일하다. 다만 해당 메서드를 호출함에 있어서

 

// 가변인수 사용
printArgs("Hello", "World");

 

// List사용
List<String> args = Arrays.asList("Hello", "World");
printArgs(args);  // List 사용

따라서 가변인자는('...')는 호출 코드의 가독성과 사용편의성을 높일 수 있는 장점이 있다.