지난번에 작성한 JavaScript의 Spread 연산자 에 이어, 자바편을 작성해보고자 한다.
JavaScript의 Spread 연산자 와 같은 연산자가 Java에는 없을까 생각했다.
유레카🥸✨ 역시나 있었다. 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
'Java' 카테고리의 다른 글
[Java8] Stream(스트림) - map/filter/sort/distinct (0) | 2021.11.24 |
---|---|
[Java] Servlet(서블릿)과 JSP 기초 (0) | 2019.05.16 |
[Java] DAO/DTO 객체 (0) | 2019.04.21 |
[Java] MVC패턴 이해하기 (0) | 2019.04.20 |
[Java]자바 주사위 게임 (2인플레이) (0) | 2019.03.05 |