Language/Java

java.util.Arrays 정리

_Hiiro 2022. 10. 9. 18:11

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

 

 


참고 레퍼런스