Java/[도서] 자바의 정석

Arrays 클래스

Lea Hwang 2022. 3. 28. 22:38

자바의 정석

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장에서 다루도록 하겠습니다.