Arrays 클래스에서는 어떤 메서드를 제공할까?
Arrays 클래스
--
Arrays 클래스는
배열을 다루기 편리한 메서드들을 제공하고 모두 static으로 되어있다.
Arrays 클래스뿐만 아니라
Objects, Collections와 같이 마지막에 's'가 붙은 클래스들은
모두 편리한 static 메서드들을 제공하고 있다.
--
배열 비교 및 출력 - equals(), toString()
--
- equals() : 두 배열의 요소가 동일한지 비교
- toString() : 배열의 내용을 문자열로 반환 (이때 각 요소를 ", "로 구분하며 처음과 마지막은 "[", "]"로 묶는다.)
int[] a = {1, 2, 3};
int[] b = {2, 3, 4};
int[] c = {1, 2, 3};
System.out.println(Arrays.equals(a, b));
// false
System.out.println(Arrays.equals(a, c));
// true
int[] arr = {3, 1, 5, 2, 7, 8};
System.out.println(Arrays.toString(arr));
// [3, 1, 5, 2, 7, 8]
--
다차원 배열의 비교 및 출력 - deepEquals(), deepToString()
--
- deepEquals() : 다차원 배열의 요소가 동일한지 비교 (일반 배열 비교인 equals()의 다차원 버전)
- deepToString() : 다차원 배열을 문자열로 반환 (일반 배열을 문자열로 반환하는 toString()의 다차원 버전)
String[][] a = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] b = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
System.out.println(Arrays.deepEquals(a, b));
// true
int[][] arr2 = {{1, 2}, {9, 8}};
System.out.println(Arrays.deepToString(arr2));
// [[1, 2], [9, 8]]
--
배열 복사 - copyOf(), copyOfRange()
--
- copyOf() : 배열의 처음부터 지정된 index 범위까지 복사
- copyOfRange() : 배열의 원하는 index 범위를 복사
범위의 마지막(끝)을 의미하는 index는 포함하지 않는다.
ex) 3 ~ 9 index 범위만큼 복사 => 실제로 인덱스 3부터 8까지만 복사된다. (3, 4, 5, 6, 7, 8)
int[] arr = {0, 1, 2, 3, 4, 5}
int[] a = Arrays.copyOf(arr, 4);
// [0, 1, 2, 3]
int[] b = Arryas.copyOf(arr, arr.length);
// [0, 1, 2, 3, 4, 5]
int[] c = Arrays.copyOf(arr, 10);
// [0, 1, 2, 3, 4, 5, 0, 0, 0, 0]
int[] A = Arrays.copyOfRange(arr, 2, 4);
// [2, 3]
int[] B = Arrays.copyOfRange(arr, 5, 9);
// [5, 0, 0, 0]
만약 배열 크기보다 큰 범위를 지정하면 0으로 채워 복사한다.
--
배열 채우기 - fill(), setAll()
--
- fill() : 지정한 값으로 배열 요소를 모두 채움
- setAll() : 람다식을 사용하여 배열 요소를 채움
int[] arr = new int[5];
Arrays.fill(arr, 5);
// [5, 5, 5, 5, 5]
int[] arr = new int[5];
Arrays.setAll(arr, () -> (int)(Math.random() * 5) + 1);
// 1~5 랜덤 값을 순자척으로 배열에 할당
// [2, 1, 4, 4, 5]
--
배열 -> List 변환 - asList(Object... a)
--
- asList(Object... a) : 배열을 List(컬렉션)으로 변환하여 반환
다만 이렇게 변환하여 반환한 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);
//예외발생!! 값 변경 불가능 / 읽기만 가능
만약 진짜 List컬렉션으로 만들어서 사용하고 싶다면
ArraysList 또는 LinkedList를 새로 만들어서 할당하여 사용하면 된다.
List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
list.add(6); // 정상작동
--
배열 정렬 및 검색 - sort, binarySearch()
--
- sort() : 배열의 요소(내용)를 정렬
- binarySearch() : 배열의 요소(내용)를 검색
binarySearch()는 정렬된 배열에서 사용해야 한다.
[이진 탐색 과정 예시]
1 ~ 10 값을 가진 배열에서 7값을 찾는 과정
1. 첫 번째 탐색
배열 범위 low = 0, high = 9로
중간 인텍스 계산 = (low + high) / 2 = 4
즉 배열의 중간 값은 arr[4] = 5
찾은 중간값과 목표값인 7을 비교하여 목푯값이 더 큰지 작은지 판단
- 중앙값(5)이 목표값(7)보다 작음 = 중앙값(5)을 기준으로 우측으로 탐색 범위로 좁힘
2. 두 번째 탐색
배열 범위 low = 5, high = 9로
중간 인텍스 계산 = (low + high) / 2 = 7
즉 배열의 중간 값은 arr[7] = 8
찾은 중간값과 목표값인 7을 비교하여 목푯값이 더 큰지 작은지 판단
- 중앙값(8)이 목표값(7)보다 큼 = 중앙값(8)을 기준으로 좌측으로 탐색 범위로 좁힘
3. 세 번째 탐색
배열 범위 low = 5, high = 6로
중간 인텍스 계산 = (low + high) / 2 = 5
즉 배열의 중간 값은 arr[5] = 6
찾은 중간값과 목표값인 7을 비교하여 목푯값이 더 큰지 작은지 판단
- 중앙값(6)이 목표값(7)보다 작음 = 중앙값(6)을 기준으로 우측으로 탐색 범위로 좁힘
4. 네 번째 탐색
배열 범위 low = 6, high = 6로
중간 인텍스 계산 = (low + high) / 2 = 6
즉 배열의 중간 값은 arr[5] = 7
찾은 중간값과 목표값인 7을 비교하여 목푯값이 더 큰지 작은지 판단
- 중앙값(7)이 목표값(7)과 동일 = 즉시 탐색 종료
위와 같은 방식으로 탐색하기 때문에
요소의 값들이 정렬되어 있어야 한다.
int[] arr = {3, 2, 0, 1, 4};
int idx = Arrays.binarySearch(arr, 2);
// idx = -5 잘못된 결과가 나옴
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
// [0, 1, 2, 3, 4]
int idx = Arrays.binarySearch(arr, 2);
// idx = 2 올바른 결과가 나옴
--
'Language > Java' 카테고리의 다른 글
Iterator & ListIterator (0) | 2024.12.21 |
---|---|
[Java] Stack과 Queue 사용하기 (1) | 2024.12.20 |
Vector, ArrayList, LinkedList (0) | 2024.12.18 |
컬렉션 프레임워크 ( List, Set, Map ) (0) | 2024.12.11 |
[java.lang] Math 클래스 (수학적 계산 관련 클래스) (0) | 2024.11.05 |