Java

컬렉션 프레임워크 - Arrays

hongdangmoo 2022. 7. 13. 22:41

Arrays

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

 

CopyOf(), CopyOfRange()

-> CopyOf()는 배열 전체를 복사하여 새로운 배열을 만들어 반환한다.

-> CopyOfRange()는 배열의 일부를 복사하여 새로운 배열을 만들어 반환한다.

int[] arr = {0,1,2,3,4};

int[] arr2 = Arrays.copyOf(arr, arr.length); // arr2 = {0,1,2,3,4};
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);  // arr5 = {2,3};

fill(), setAll()

-> fill()은 배열의 모든 요소를 지정한 값으로 저장한다.

-> setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 갖는다. setAll()을 호출하려면 함수형 인터페이스를 구현한 객체를 매개변수로 지정하거나 람다식을 지정해야한다.

int[] arr7 = new int[5];
Arrays.fill(arr7, 9);		// arr7 = {9,9,9,9,9}
        
Arrays.setAll(arr7,i-> (int)(Math.random() * 6) + 1);

 

sort(), binarySearch()

-> sort()는 배열을 정렬할 때 사용한다.

-> binarySearch()는 배열에 저장된 요소를 검색할 때 사용한다. 또한 binarySearch()를 사용하려면 배열이 반드시 정렬된 상태이어야 정상적인 결과가 나온다. 검색한 값과 동일한 요소들이 있으면, 동일한 요소들 중 어떤 것의 위치가 반환될 지는 알 수 없다.

int[] arr = {2,1,4,7,3};
int id = Arrays.binarySearch(arr,2); // arr이 정렬되지 않아 잘못된 결과를 가져온다.

Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // {1,2,3,4,7}
id = Arrays.binarySearch(arr,2); // id = 2

-> 결과

equals(), toString()

-> toString()은 배열의 모든 요소를 문자열로 출력한다. toString()은 일차원 배열에서만 사용가능하다.

-> 2차원 이상의 배열에서는 deepToString()을 사용한다. deepToString()은 배열의 모든 요소를 재귀적으로 접근하여 문자열을 구성한다. 

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

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

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

-> 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)); //equals()는 일차원 배열에서만 사용 가능 따라서 false
System.out.println(Arrays.deepEquals(str2d, str2d2)); // true

-> 위 코드에서 str2d와 str2d2는 2차원 배열이므로 equals()로 비교하면 false를 리턴한다.

 

asList(Object a)

-> asList()는 배열을 List에 담아서 리턴한다. 매개변수의 타입이 가변인수기 때문에 배열 생성 없이 저장할 요소들만 나열하는 것도 가능하다.

-> 결과

-> asList()가 반환한 List의 크기를 변경할 수 없다. 

-> 추가나 삭제가 불가능하며, 저장된 내용은 변경가능하다. 

-> 만약 크기를 변경할 수 있는 List가 필요하면 새로운 ArrayList를 생성하여 List의 크기를 변경한다.

List list = new ArrayList(Arrays.asList(1,2,3,4,5));

 

 

-> 결과

-> 새로운 ArrayList를 생성하여 List의 요소를 추가하면 정상적으로 작동한다.

 

-> 전체 사용 예

import java.util.*;

public class ArraysEx {
	public static void main(String[] args) {
		
		int[] arr = {0,1,2,3,4};
		int[][] arr2d = {{11,12,13},{21,22,23}};
		
		System.out.println("arr = " + Arrays.toString(arr));
		System.out.println("arr2 = " + Arrays.deepToString(arr2d));
		
		int[] arr2 = Arrays.copyOf(arr, arr.length);
		int[] arr3 = Arrays.copyOf(arr, 3);
		int[] arr4 = Arrays.copyOf(arr, 7);
		int[] arr5 = Arrays.copyOfRange(arr, 2, 4);
		int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
		
		System.out.println("arr2 = " + Arrays.toString(arr2));
		System.out.println("arr3 = " + Arrays.toString(arr3));
		System.out.println("arr4 = " + Arrays.toString(arr4));
		System.out.println("arr5 = " + Arrays.toString(arr5));
		System.out.println("arr6 = " + Arrays.toString(arr6));
		
		int[] arr7 = new int[5];
		Arrays.fill(arr7, 9);		// fill() arr7의 값을 9로 채운다.
		System.out.println("arr7 = " + Arrays.toString(arr7));
		
		Arrays.setAll(arr7,i-> (int)(Math.random() * 6) + 1);
		System.out.println("arr7 = " + Arrays.toString(arr7));
		
		for(int i: arr7) {
			char[] graph = new char[i];
			Arrays.fill(graph, '*');
			System.out.println(new String(graph) + i);
		}
		
		String[][] str2d = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
		String[][] str2d2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
		
		System.out.println(Arrays.equals(str2d, str2d2)); //equals()는 일차원 배열에서만 사용 가능 따라서 false
		System.out.println(Arrays.deepEquals(str2d, str2d2)); // true
		
		char[] chArr = {'A','D','C','B','E'};
		
		System.out.println("chARr = " + Arrays.toString(chArr));
		System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B'));
		System.out.println("= After Sorting =");
		Arrays.sort(chArr);
		System.out.println("chArr = " + Arrays.toString(chArr));
		System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B'));
		
	}

	

}

-> 결과

-> 결과에서 index of B가 -2가 나온 것은 binarySearch()는 배열이 반드시 정렬된 상태에서만 정확한 값을 반환하는데 배열chArr은 정렬되어 있지 않게 때문에 정상적인 값을 반환할 수 없기 때문이다.

-> After Sorting 이후에 chArr을 정렬하여 다시 출력하면 올바른 결과 1이 나온다.

 

★ 참고 및 출처

자바의 정석(3판)

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=76083001