본문 바로가기
프로그래밍언어/Java

[자바의 정석] 11. 컬렉션 프레임웍 - Arrays / Comparator와 Comparable

by qkzkdo 2023. 8. 6.
728x90

1.6 Arrays

Arrays클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다.

❗Arrays에 정의된 메서드는 모두 static메서드이다.

 

Arrays에 정의된 toString()
static String toString(Object[] a)
static String toString(int[] a)
//그외 기본형

 

배열의 복사 - copyOf(), copyOfRange()

copyOf() - 배열의 전체를 복사해서 새로운 배열을 만들어 반환

copyOfRange() - 배열의 일부를 복사해서 새로운 배열을 만들어 반환(끝은 포함x)

int[] arr = [0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2=[0,1,2,3,4]
int[] arr3 = Arrays.copyOf(arr, 3); //arr3=[0,1,2]
int[] arr4 = Arrays.copyOf(arr, 7); //arr4=[0,1,2,3,4,0,0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); //arr5=[2,3] <-4는 불포함
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); //arr6=[0,1,2,3,4,0,0]

 

배열 채우기 - fill(), setAll()

fill() - 배열의 모든 요소를 지정된 값으로 채운다.

setAll() - 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다.

*함수형 인터페이스를 구현한 객체를 매개변수로 지정 or 람다식을 지정해야함

int[] arr = new int[5];
Arrays.fill(arr, 9); //arr = [9,9,9,9,9]
//람다식
Arrays.setAll(arr, () -> (int)(Math.random()*5)+1); //arr = [1,5,2,1,1]

 

배열의 정렬과 검색 - sort(), binarySearch()

sort() - 배열을 정렬할 때 사용

binarySearch() - 배열에 저장된 요소를 검색할 때 사용(반드시 배열이 정렬된 상태이어야 올바른 결과를 얻는다.)

int[] arr = {3,2,0,1,4};
int idx = Arrays.binarySearch(arr, 2); //idx = -5 <-잘못된 결과

Arrays.sort(arr); //배열 arr을 정렬한다.
System.out.println(Arrays.toString(arr)); //[0,1,2,3,4]
int idx = Arrays.binarySearch(arr, 2) //idx = 2 <-올바르결과

 

순차검색(linear search) : 배열의 첫 번째 요소부터 순서대로 하나씩 검색하는 것

이진 검색(binary search) : 배열의 검색할 범위를 반복적으로 절반씩 줄여가면서 검색(속도빠름, 단, 배열이 정렬이 되어 있는 경우에만 사용할 수 있다.)

 

배열의 비교와 출력 - equals(), toString()

toString() - 배열의 모든 요소를 문자열로 편리하게 출력할 수 있다.(일차원 배열에서만 사용 가능)

deepTo String() - 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성(다차원 배열에서 사용)

int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12}, {21,22}};

System.out.println(Arrays.toString(arr));
System.out.println(Arrays.deepToString(arr2D));

 

equals() - 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다. (일차원 배열에서만 사용 가능)

deepEquals() - 다차원 배열의 비교에 사용

String[][] str2D = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};

System.out.println(Arrays.equals(str2D, str2D2)); //false //주소를 배교함
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true

 

 

배열을 List로 변환 - asList(Object… a)

asList() - 배열을 List에 담아서 반환 (매개변수 타입이 가변인수라서 배열 생성 없이 저장할 요소들만 나열하는 것도 가능)

List list = Arrays.asList(new Integer[]{1,2,3,4,5}; //list = [1,2,3,4,5]
List list = Arrays.asList(1,2,3,4,5); //list = [1,2,3,4,5]
list.add(6); //UnsupportedOperationException 예외 발생 //읽기 전용

 

1.7 Comparator와 Comparable

Arrays.sort()를 호출만 하면 알아서 배열을 정렬하는게 아니라 Character클래스의 Comparable의 구현에 의해 정렬되었던 것

Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다

 

 

Comparable : 기본 정렬기본을 구현하는데 사용

Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

 

compare()와 compareTo()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 고안된 것

 

 

 

출처 : 남궁성. 「자바의 정석」. 도우출판. 2016

728x90