Java

[Java] 가변인자 (Varargs) / ... 연산자

didue 2022. 1. 16. 22:50
반응형

 

 

지난번에 작성한 JavaScript의 Spread 연산자 에 이어, 자바편을 작성해보고자 한다.

JavaScript의 Spread 연산자 와 같은 연산자가 Java에는 없을까 생각했다.

 

 

[ES6] Spread 와 Rest 파라미터 ( ... 연산자)

(이 포스팅은 이전 블로그에서 옮겨왔습니다) 근래 JavaScript를 아주 씐나게 공부하고 있는 와중에, ECMA2015(ES6)에서 추가된 새로운 연산자가 있어 공부해보았다.😛 Spread Operator Spread 문법은 ... 

fascinate-zsoo.tistory.com

 

유레카🥸✨ 역시나 있었다. Java에서는 이를 가변인자(varargs) 라고 부른다.

Javascript에서의 사용법과는 조금 차이가 있으니 이제부터 알아보도록 하자!

 

 


 

Java 5 이전에는 같은 자료형을 여러개 받고자 할 때, Overroading 을 통해 동일한 명칭의 함수를 Arguments(변수) 에 따라 생성했어야 했습니다.

//Before Java 5

public void simple(String str1) {...}
public void simple(String str1, String str2) {...}
public void simple(String str1, String str2, String str3) {...}

... //반복

 

혹은 입력 인자의 타입을 배열로 지정하여 이렇게 받아 사용했습니다.

배열을 입력인자로 사용할 경우 함수 선언시 입력 형태는 간결해지나, 실제 메소드를 호출하는 영역에서는 배열에 값을 넣는 작업을 수행해야하는 번거로움이 수반되었습니다.

//함수 선언부
public static void test(String[] params) {...}

//함수 호출부
public static void main(String[] args){
        //중략
        String[] params1 = new String[]{"a", "b", "c"};
        test(params1);

        //또는 
        List<String> params2 = new ArrayList<String>();
        params2.add("a");
        params2.add("b");
        params2.add("c");
        test(param2.toArray());
}

 

 

하지만 Java 5 에 도입된 Varargs(가변인자) 는 하나의 타입의 임의의 개수를 매개변수로 사용할 수 있도록 지원합니다! 👏 또한 ... 연산자를 통해 간단하게 가변인자를 표현할 수 있습니다.

 

Varargs (가변인자)

Varargs 는 내부적으로 배열을 사용하여 매개변수를 자동으로 처리하는 새로운 문법이므로, 사용시 배열에서의 작업과 같은 방식으로 사용해야 합니다.

 

가변인자 ... 연산자 사용법

사용법은 간단합니다! 💁‍♀️

//함수 선언부
public void formatWithVarargs(String ...args){ ... } 

//함수 호출시 
formatWithVarargs();
formatWithVarargs("a", "b", "c", "d");

 

 

Varargs의 사용 룰

  • 각 메소드는 가변인자를 하나만 가질 수 있다.
// ERROR!
public void needOnlyVarargs(String ...args1, String ...args2) {...}

 

  • 가변인자는 함수의 마지막 매개변수여야 합니다.
//입력 매개변수 중 마지막이여야한다.
public void haveToLastPosition(int num, String ...args) {...}

 

 

가변인자의 안전한 사용

varargs 를 사용할 때마다 Java 컴파일러는 주어진 매개변수를 저장할 배열을 생성합니다.

이 경우 컴파일러는 인수를 보유할 제네릭 형식 구성 요소가 있는 배열을 만듭니다. 제네릭 유형과 함께 varargs 를 사용할 때 치명적인 런타임 예외의 잠재적 위험이 있으므로 Java 컴파일러는 안전하지 않은 varargs 사용 가능성에 대해 경고합니다.

warning: [varargs] Possible heap pollution from parameterized vararg type T

 

 

가변인자의 사용은 아래와 같은 경우에만 사용하는 것이 안전합니다.

  • 암시적으로 생성된 배열에는 아무 것도 저장하지 않습니다. 이 예에서는 해당 배열에 List 를 저장했습니다.
  • 생성된 배열에 대한 참조가 메서드를 탈출하지 못하게 합니다(나중에 자세히 설명)

혹은 메소드 자체가 가변인자 를 안전하게 사용한다고 확신하는 경우 @SafeVarargs 를 사용 하여 경고를 억제할 수 있습니다.

 

 

 

[참고]

Varargs in Java | Baeldung :  https://www.baeldung.com/java-varargs

반응형