2022. 3. 28. 22:38ㆍJava/[도서] 자바의 정석
자바의 정석
Chapter | 소제목 |
11. 컬렉션 프레임웍(Collections Framework) | 1.6 Arrays |
Arrays클래스는 배열을 다루기 편리한 메서드를(static) 제공합니다.
|참고| Arrays에 정의된 메서드는 모두 static메서드입니다.
같은 기능의 메서드가 배열의 타입만 다르게 오버로딩되어 있어서 많아 보이지만 실제로는 그리 많지 않기에 이 장에서는 int 배열인 메서드에 대한 사용법만 살펴보도록 하겠습니다.
배열의 출력 toString( ), deepToString( )
배열의 모든 요소를 문자열로 출력할 수 있습니다.
toString( )은 1차원 배열에서 deepToString( )은 2 ~ 다차원 배열에서 사용가능합니다.
1차원 배열
Arrays.toStirng(arr); // [0,1,3,3,4]
2차원 배열
Arrays.deepToString(arr2D) // [[11,23,23], [54,56,89]]
배열의 복사 copyOf( ), copyOfRange( )
두 메서드는 배열을 복사해서 새로운 배열을 만들어 반환한다는 공통점을 가지고 있습니다.
copyOf( )는 배열 전체를, copyOfRange( )는 배열의 일부를 복사합니다.
만약에 배열 길이보다 더 길게 복사할 경우 그 부분은 0으로 채워서 반환합니다.
copyOfRange(from, to)의 개념으로 from은 포함하고 to는 포함하지 않는다는 것을 주의해야 합니다.
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]
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // arr6 = [0,1,2,3,4,0,0]
배열 채우기 fill( ), setAll( )
fill( )은 배열의 모든 요소를 지정된 값으로 채웁니다. setAll( )의 경우 배열을 채우는 데 사용할 함수형 인터페이스를 매개변수로 받습니다. 이 메서드를 호출할 때는 함수형 인터페이스를 구현한 객체를 매개변수로 지정하던가 람다식을 지정해야 합니다. 아직 함수형 인터페이스와 람다식을 정리하기 전이므로 이 장에서는 setAll( )에는 람다식을 이용하는구나 정도로 이해하고 넘어가도록 합시다.
int[] arr = new int[5];
Arrays.fill(arr, 9); // 특정값으로 채워짐 arr = [9,9,9,9,9]
Arrays.setAll(arr, () -> (int)(Math.random()*5+1); // 1<= x <6범위내에서 랜덤값으로 채워짐 arr = [2,1,3,3,5]
배열의 정렬과 검색 sort( ), binarySearch( )
sort( )는 배열을 정렬할 때, binarySearch( )는 배열에 저장된 요소를 검색(탐색)할 때 사용하며 특정 값의 저장된 위치(index)를 찾아서 반환합니다.
binarySearch( )는 이진 탐색, 이분 탐색이라고도 하며 대표적인 예로는 전화번호부를 반씩 찢어가면서 특정 요소를 찾을 때 사용합니다.
💡 기억해야 할 점은 binarySearch( )를 하기 전에 반드시 정렬된 상태여야 합니다.
int[] arr = {3,2,0,1,4};
int idx = Arrays.binarySearch(arr, 2); // 2가 어느 index에 있는지 idx = -5 <- 잘못된 결과
// 배열arr을 정렬한다.
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [0,1,2,3,4]
int idx = Arrays.binarySearch(arr, 2); // idx = 2 <- 올바른 결과
배열의 비교 equals( ), deepEquals( )
두 비교 메서드는 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환합니다.
1차원 배열 비교 시에는 equals( )를 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)); // false
System.out.println(Arrays.deepEquals(str2D, str2D2)); // true
배열을 List로 변환 asList( )
asList( )는 배열을 List에 담아서 반환합니다. asList매개변수로는 asList(배열)을 담을 수도 있고 asList(가변 매개변수)를 담을 수도 있습니다. 여기서 가변 매개변수란 개수가 정해져 있지 않다는 의미로 저장할 요소를 나열해도 된다는 의미입니다.
💡 한 가지 주의할 점은 asList( )의 경우 읽기 전용이므로 저장된 내용은 변경 가능하지만
크기를 변경할 수 없어 추가 또는 삭제가 불가능합니다.
만약 크기를 변경해야 한다면 Arrays.asList를 담은 새로운 ArrayList를 선언해서 사용할 수 있습니다.
List list = Arrays.asList(new Integer[]{1,2,3,4,5}); // 매개변수에 배열 넣음 list = [1,2,3,4,5]
List list = Array.asList(1,2,3,4,5); // 매개변수에 가변 매개변수넣음 list = [1,2,3,4,5]
list.add(6); // UnsupportedOperationException 예외 발생
// 만일 크기를 변경하고 싶다면
List list = new ArrayList(Arrays.asList(1,2,3,4,5));
parallelXXX( ), spliterator( ), stream( )
이 외에도 위와 같은 메서드들이 있는데 이 메서드들은 14장. 람다와 스트림 관련 내용이므로 자세한 건 14장에서 다루도록 하겠습니다.
'Java > [도서] 자바의 정석' 카테고리의 다른 글
배열 오름차순, 내림차순 정렬하기 (0) | 2022.04.25 |
---|---|
형변환 (문자형↔정수형↔실수형) (0) | 2022.04.23 |
String 클래스 메서드 (0) | 2022.04.21 |
💡 10진수 ↔ 2진수, 8진수, 16진수 변환 방법 (0) | 2022.04.20 |
[도서] 자바의 정석 큐레이션 (0) | 2022.03.28 |