Arrays 클래스 개요
Arrays 클래스는 배열을 조작하기 위한(정렬 및 검색 등) 다양한 메소드들을 포함하고 있는 클래스이다. 이 클래스는 배열을 리스트처럼 다룰 수 있도록 하게 해주는 static factory를 포함한다.
※ static factory : 클래스의 인스턴스화, 즉 객체 생성을 constructor(생성자)가 아닌 static 메소드로 하는 것을 static factory 메소드라고 한다.
대표적인 Arrays 메소드
메소드 | 설명 |
static <T> List<T> asList(T...a) | 전달받은 배열을 고정 크기의 List로 변환하여 리턴 |
static int binarySearch(Object[] a, Object key) | binary search 알고리즘을 이용하여 주어진 배열에서 key값을 검색하고, 그 index를 리턴한다. |
static <T> T[] copyOf(T[] original, int newLength) | 전달받은 배열을 특정 길이의 새로운 배열로 복사하여 반환한다. |
static <T> T[] copyOfRange(T[] original, int from, int to) | 전달받은 배열의 특정 범위에 해당하는 요소만을 새로운 배열로 복사하여 반환한다. |
static void fill(Object[] a, Object val) | 전달받은 배열의 모든 요소를 특정 값으로 초기화한다. |
static <T> void sort(T[] a, Comparator<? super T> c) | 전달받은 배열의 모든 객체들을 명시된 comparator에서 유도된 순서로 정렬한다. 배열 내 모든 요소들은 명시된 comparator로 상호 비교 가능해야만 한다. |
public static boolean equals(Object[] a1,Object[] a2) | 전달받은 두 배열을 얕은 비교한 이후 같다면 true 값을 리턴한다. 두 배열이 모두 같은 개수의 요소를 가지고, 모든 요소 값이 동일하다면 이 두 배열은 동일하다고 판단한다. (2차원 배열 이상은비교하지 못한다.) |
public static boolean deepEquals(Object[] a1, Object[] a2) | 전달받은 두 배열을 깊은 비교한 이후 같다면 true 값을 리턴한다. 두 배열이 모두 같은 개수의 요소를 가지고, 모든 요소 값이 동일하다면 이 두 배열은 동일하다고 판단한다. (2차원 배열 이상의 경우 중첩된 하위 배열의 항목들까지 전부 비교한다.) |
Arrays.binarySearch(Object[] a, Object key)
매개변수로 넘겨지는 배열은 반드시 정렬 상태여야 한다.
만약 주어진 배열 내에 찾고자 하는 key값이 존재하지 않는다면 해당 key값이 삽입되었을 때 정렬상태를 유지하는 위치를 찾은 후 -1을 곱한 뒤에 1을 뺀 값을 리턴해준다.
Arrays.copyOf(T[] original, int newLength)
복사할 길이는 원본 배열보다 더 커도 되며, 리턴되는 새로운 배열의 길이가 된다. 이러한 경우 늘어난 길이 만큼에 위치하는 값들은 배열 요소의 타입에 맞게 기본값들로 초기화되게 된다.
Arrays.copyOfRange(T[] original, int from, int to)
첫 번째 매개변수로 넘겨 받은 원본 배열에서 from 인덱스부터 to 인덱스 바로 전까지에 해당하는 요소들을 복사한 새로운 배열을 생성하여 리턴해준다.
Arrays.sort(T[] a, Comparator<? super T> c)
기본적으로 comparator 객체를 매개변수로 넘겨주지 않으면 natural order(오름차순)로 정렬하도록 설정되어 있다. 내림차순으로 정렬되기를 원한다면 아래처럼 Collections 클래스에서 reverseOrder() 메소드를 인자로 넘겨주어야 한다.
// primitive 데이터 배열은 sort 메소드를 사용할 수 없다.
Integer[] arr = {15, 3, 30, 40, 65, 80, 54};
//Collections 클래스 내부에 미리 구현되어 있는 Comparator를 전달한다.
Arrays.sort(arr, Collections.reverseOrder());
//Comparator를 직접 구현하는 방식
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
//Lambda 형으로 구현 (자바 8 이상부터 사용 가능)
Arrays.sort(arr, (o1, o2) -> o2-o1);
for(int x : arr) System.out.print(x+" "); // 80 65 54 40 30 15 3
Arrays.equals() & Arrays.deepEquals()
int[][] originArr = {{1,2,3},{4,5,6}};
//copyOf 얕은 복사
int[][] copied1 = Arrays.copyOf(originArr,originArr.length);
System.out.println("얕은 복사 후 비교");
System.out.println("배열의 주소값 비교 : " + originArr.equals(copied1)); //false
System.out.println("1차원 배열의 항목값 비교 : " + Arrays.equals(originArr, copied1)); //true
System.out.println("중첩 배열 항목값 비교 : " + Arrays.deepEquals(originArr, copied1)); //true
System.out.println();
//copyOf 깊은 복사
int[][] copied2 = Arrays.copyOf(originArr,originArr.length);
copied2[0] = Arrays.copyOf(originArr[0],originArr[0].length);
copied2[1] = Arrays.copyOf(originArr[1], originArr[1].length);
System.out.println("깊은 복사 후 비교");
System.out.println("배열의 주소값 비교 : " + originArr.equals(copied2)); //false
System.out.println("1차원 배열의 항목값 비교 : " + Arrays.equals(originArr, copied2)); //false
System.out.println("중첩 배열 항목값 비교 : " + Arrays.deepEquals(originArr, copied2)); //true
참고 레퍼런스
- https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html
- https://kephilab.tistory.com/102
- https://jy-tblog.tistory.com/38
- http://www.tcpschool.com/java/java_api_arrays
- https://junlab.tistory.com/236
'Language > Java' 카테고리의 다른 글
[JAVA] Comparator (0) | 2024.08.20 |
---|---|
[Java] String to List (0) | 2022.11.07 |
[Java] String to Integer, Integer to String (0) | 2022.10.09 |
배열(Array)과 리스트(List) (0) | 2022.10.09 |