Arrays 메서드

정순동·2023년 12월 19일
0

자바기초

목록 보기
61/89

Arrays클래스에는 여러가지 static으로 정의 된 메서드들이 있다(메서드들 모두 static임).

toString()

반환타입이 기본형8개와 참조형1개(Object)로 오버로딩 돼 있는 toString()메서드가 존재한다.

배열의 복사 - 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[] 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()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다. 이 메서드를 호출할 때는 함수형 인터페이스를 구현한 객체를 매개변수로 지정하던가 아니면 람다식을 지정해야 한다.

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

setAll는 1~5 범위의 임의의 정수를 반환하여 배열에 저장한다.

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

sort()는 배열을 정렬할 때, 그리고 저장된 요소를 검색할 떄는 binarySearch()를 사용한다.
binarySearch()는 지정된 값이 배열에서 몇번째 index인지 찾아 반환하는데 반드시 배열이 정렬된 상태여야 올바른 결과를 얻는다. 만일 검색한 값과 일치하는 요소가 여러개라면 어떤 것의 위치가 변환될지는 알 수 없다.

	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)'은 배열의 검색할 범위를 반복적으로 절반씩 줄여가며 검색하기에 검색속도가 상당히 빠르다는 장점이 있다. 단, 배열이 정렬돼 있어야 한다.

배열의 비교와 출력

문자열의 비교와 출력 - eqauls(), toString()

toString()으로 배열의 모든 요소를 문자열로 편하게 출력한다. toString()은 1차원 배열에서만, 다차원 배열에서는 deepToString()을 사용해야 한다.

	int[] arr = {0,1,2,3,4};
    int[][] arr2D = {{11,12}, {21,22}};
    
    System.out.println(Arrays.toString(arr));			// [0, 1, 2, 3, 4]
    System.out.println(Arrays.deepToString(arr2D));		// [[11, 12], [21, 22]]

eqauls()는 두 배열에 저장된 모든 요소를 비교해서 같으면 true를 반환한다.
toString()과 마찬가지로 다차원 배열에서는 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

똑같이 deep이 붙지 않은 메서드로 다차원 배열을 검사하면 2차 이상의 배열을 검사할 때 배열의 주소를 비교해버리기 때문에 false가 나온다.

배열의 변환

배열을 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 발생

asList()가 반환한 List는 크기를 변경할 수 없다. 즉 추가, 삭제가 불가능 하다. 이렇게 반환된 List를 아래처럼 다시 만들어주면 크기가 변경된다.

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

parallelXXX(), spliterator(), stream()

'parallel'로 시작하는 메서드들은 보다 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리하도록 한다. spliterator()는 여러 쓰레드가 처리할 수 있게 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환하며, stream()은 컬렉션을 스트림으로 변환한다.

0개의 댓글