컬렉션 프레임워크 - Arrays
◎ Arrays
-> Arrays클래스는 배열을 다루는데 유용한 메서드가 정의되어 있다.
◎ CopyOf(), CopyOfRange()
-> CopyOf()는 배열 전체를 복사하여 새로운 배열을 만들어 반환한다.
-> CopyOfRange()는 배열의 일부를 복사하여 새로운 배열을 만들어 반환한다.
int[] arr = {0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr2 = {0,1,2,3,4};
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); // arr5 = {2,3};
◎ fill(), setAll()
-> fill()은 배열의 모든 요소를 지정한 값으로 저장한다.
-> setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 갖는다. setAll()을 호출하려면 함수형 인터페이스를 구현한 객체를 매개변수로 지정하거나 람다식을 지정해야한다.
int[] arr7 = new int[5];
Arrays.fill(arr7, 9); // arr7 = {9,9,9,9,9}
Arrays.setAll(arr7,i-> (int)(Math.random() * 6) + 1);
◎ sort(), binarySearch()
-> sort()는 배열을 정렬할 때 사용한다.
-> binarySearch()는 배열에 저장된 요소를 검색할 때 사용한다. 또한 binarySearch()를 사용하려면 배열이 반드시 정렬된 상태이어야 정상적인 결과가 나온다. 검색한 값과 동일한 요소들이 있으면, 동일한 요소들 중 어떤 것의 위치가 반환될 지는 알 수 없다.
int[] arr = {2,1,4,7,3};
int id = Arrays.binarySearch(arr,2); // arr이 정렬되지 않아 잘못된 결과를 가져온다.
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // {1,2,3,4,7}
id = Arrays.binarySearch(arr,2); // id = 2
-> 결과
◎ equals(), toString()
-> toString()은 배열의 모든 요소를 문자열로 출력한다. toString()은 일차원 배열에서만 사용가능하다.
-> 2차원 이상의 배열에서는 deepToString()을 사용한다. deepToString()은 배열의 모든 요소를 재귀적으로 접근하여 문자열을 구성한다.
int[] arr = {0,1,2,3,4};
int[][] arr2d = {{11,12,13},{21,22,23}};
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.deepToString(arr2d));
-> equals()는 두 배열에 저장된 모든 요소를 비교하여 같으면 true, 다르면 false를 리턴한다. 일차원 배열에서만 사용 가능하다.
-> 2차원 이상의 다차원 배열의 비교에서는 deepEquals()를 사용한다.
String[][] str2d = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2d2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2d, str2d2)); //equals()는 일차원 배열에서만 사용 가능 따라서 false
System.out.println(Arrays.deepEquals(str2d, str2d2)); // true
-> 위 코드에서 str2d와 str2d2는 2차원 배열이므로 equals()로 비교하면 false를 리턴한다.
◎ asList(Object a)
-> asList()는 배열을 List에 담아서 리턴한다. 매개변수의 타입이 가변인수기 때문에 배열 생성 없이 저장할 요소들만 나열하는 것도 가능하다.
-> 결과
-> asList()가 반환한 List의 크기를 변경할 수 없다.
-> 추가나 삭제가 불가능하며, 저장된 내용은 변경가능하다.
-> 만약 크기를 변경할 수 있는 List가 필요하면 새로운 ArrayList를 생성하여 List의 크기를 변경한다.
List list = new ArrayList(Arrays.asList(1,2,3,4,5));
-> 결과
-> 새로운 ArrayList를 생성하여 List의 요소를 추가하면 정상적으로 작동한다.
-> 전체 사용 예
import java.util.*;
public class ArraysEx {
public static void main(String[] args) {
int[] arr = {0,1,2,3,4};
int[][] arr2d = {{11,12,13},{21,22,23}};
System.out.println("arr = " + Arrays.toString(arr));
System.out.println("arr2 = " + Arrays.deepToString(arr2d));
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, 3);
int[] arr4 = Arrays.copyOf(arr, 7);
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
System.out.println("arr2 = " + Arrays.toString(arr2));
System.out.println("arr3 = " + Arrays.toString(arr3));
System.out.println("arr4 = " + Arrays.toString(arr4));
System.out.println("arr5 = " + Arrays.toString(arr5));
System.out.println("arr6 = " + Arrays.toString(arr6));
int[] arr7 = new int[5];
Arrays.fill(arr7, 9); // fill() arr7의 값을 9로 채운다.
System.out.println("arr7 = " + Arrays.toString(arr7));
Arrays.setAll(arr7,i-> (int)(Math.random() * 6) + 1);
System.out.println("arr7 = " + Arrays.toString(arr7));
for(int i: arr7) {
char[] graph = new char[i];
Arrays.fill(graph, '*');
System.out.println(new String(graph) + i);
}
String[][] str2d = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2d2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2d, str2d2)); //equals()는 일차원 배열에서만 사용 가능 따라서 false
System.out.println(Arrays.deepEquals(str2d, str2d2)); // true
char[] chArr = {'A','D','C','B','E'};
System.out.println("chARr = " + Arrays.toString(chArr));
System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B'));
System.out.println("= After Sorting =");
Arrays.sort(chArr);
System.out.println("chArr = " + Arrays.toString(chArr));
System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B'));
}
}
-> 결과
-> 결과에서 index of B가 -2가 나온 것은 binarySearch()는 배열이 반드시 정렬된 상태에서만 정확한 값을 반환하는데 배열chArr은 정렬되어 있지 않게 때문에 정상적인 값을 반환할 수 없기 때문이다.
-> After Sorting 이후에 chArr을 정렬하여 다시 출력하면 올바른 결과 1이 나온다.
★ 참고 및 출처
자바의 정석(3판)