-
Java: Arrays.fill()과 Arrays.setAll()의 차이Java 2022. 7. 12. 13:54
Java: Arrays.fill()과 Arrays.setAll()의 차이
이 글은
Arrays.fill()'과 'Arrays.setAll()
의 공통점, 그리고 기억해둘 만한 차이점에 대해 이야기합니다.공통점
둘 다 배열을 위한 유틸 메서드입니다. 특정한 값으로 초기화 하고 싶을 때 사용할 수 있습니다. 그러니까 예를 들어 이런 코드를 작성하고 싶을 때 사용할 수 있어요.
for (int i = 0; i < arr.length; i++) { arr[i] = initialValue; // can be a String, an int, an some Object... }
그런데 이런 코드를 볼 때면 항상 '좀 더 간결하게 할 수 없을까?'란 생각을 하게 되죠.
그 때 사용할 수 있는게Arrays.fill()'과 'Arrays.setAll()
입니다.Arrays.fill(배열, 값)
은 파라미터로 넘겨진 배열의 모든 요소에 값을 대입합니다.Arrays.setAll(배열, function<T>)
는 파라미터로 넘겨진 배열의 모든 요소에 람다식의 리턴 값을 대입합니다.차이점
fill
은 값을,setAll
은 수행의 결과를 대입합니다.
똑같은데 더 간단한 fill을 쓰면 되겠네? 라고 생각할 수 있어요. 하지만 비슷하지만 결정적인 차이가 있는데요. 객체로 초기화 할 때가 문제입니다.Arrays.fill(arr, new Object())
과 같이 초기화를 하면 어떨까요? 값을 대입한다고 했죠?new Object()
로 생겨난 인스턴스의 값, 즉 참조값을 모든 요소에 대입합니다. 모든 배열이 하나의 인스턴스를 참조하게 되는 것이죠. [0]번 요소의 필드값을 수정하면 [1]번도, [2]번도, ..., [n]번도 모두 한 번에 수정되는 것이죠.그와 달리,
Arrays.setAll(arr, i -> new Object(i))
와 같이 초기화를 하면 매 요소마다 별개로 실행된 람다식의 결과가 대입됩니다. 즉, 똑같은new Object(i)
코드지만, 이번에는 배열의 모든 요소가 각각 새로운 인스턴스를 참조하게 됩니다. 보통은마무리
가끔 객체 배열을 만들어놓고 한 번에 초기화해야 하는 때가 있는데요.
초기화 할 때 for와 foreach가 차이나는 것처럼, fill과 setAll의 차이를 잘 알아두셨다가 적절히 사용하면 더욱 간결하고 명시적인 코딩에 도움이 될 것 같습니다 :)'Java' 카테고리의 다른 글
PS tip: 그래프 탐색의 자료구조 - ArrayDeque (3) 2022.07.26 Java: 어플리케이션 실행 옵션 비교 - VM Options / Program Arguments (0) 2022.07.19 Java: 오류Error와 예외Exception, Unchecked와 Checked (0) 2022.06.17 Java: Integer.parseInt()와 Integer.valueOf()의 차이점 구분 (2) 2022.06.06 Java: Comparable(compareTo())와 Comparator(compare())의 차이점 (0) 2022.05.17 Java: String[] split(regex, limit) 사용 예시 (0) 2022.05.17