Arrays로 배열 다루기
우리는 이전에 Math클래스를 접했었다.
Math클래스는 수학관련 메서드를 모아놓은 클래스였다.
이러한 것 처럼 오늘 다뤄볼 Arrays클래스도 배열을 다루는데 유용한 메서드들을 제공한다.
그 메서드 들은 꽤 많은데, 자주 사용하는 것 위주로 몇개만 살펴보도록 하자.
Arrays로 배열 다루기 (Arrays 클래스)
- 배열의 비교와 출력 - toString(), equals()
먼저, toString() 메서드를 보자.
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]]
toString(배열이름)메서드는,
배열에 저장된 내용을 문자열로 바꿔준다.
2차원이상(다차원) 배열일 때에는, deepToString(배열이름)
배열안에 깊이 들어가서 내용을 출력한다는 느낌으로 이해하자.
equals() 메서드를 살펴보자.
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
2차원 문자열 배열 str2D, str2D2가 있는데,
이 두배열이 같은지 비교하려면 어떻게 해야할까?
이렇게 쓰면 편할거 같은데? str2D == str2D2(?) 하지만 이렇게 등가비교연산자를 이용해서 비교하는 것은 불가능하다.
원래는 2차원 배열의 요소를 하나하나 다 비교를 해야한다. ex str2D[0][0]과 str2D2[0][0], str2D[0][1]과 str2D2[0][1] 이렇게 말이다. 모든 요소를 하나하나 비교해서 전부 같으면, 그 두배열이 같다고 이야기를 하는데,
이것을 반복문으로 전부 구현하려면 조금 귀찮다.
그래서 Arrays클래스에서 deepEquals라는 메서드를 제공한다.
2차원 문자열 배열간의 비교이기 때문에, equlas가 아닌 deepEquals메서드를 이용해야 한다.
만약에 내용이 같으면 true가 나온다. 내용이 다르면 flase가 나온다.
즉, 2차원이상(다차원) 배열일 때는, deepEquals()메서드를 사용하면 된다.
그리고 1차원 배열을 비교할 떄는 equals를 사용하면 된다.
이번에는, 배열을 복사하는 방법이다.
- 배열의 복사 - copyOf(), copyOfRange()
배열을 복사할 때, for문이나 다른방법을 사용해도 되지만,
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] 4는 불포함
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // arr6 = [0, 1, 2, 3, 4, 0, 0]
copyOf()메서드를 이용하면, 1차원배열 arr이 있을 때, 그것을 복사해서 새로운 배열을 만들 수 있다.
두번째 문장을 보면, arr배열을 복사해서 arr2라는 새로운 배열을 만드는 것이다. arr.length부분은 몇개를 복사하는지에 대한 파라미터다.
즉, Arrays.copyOf(복사할배열, 복사할요소개수); 로 사용하면 된다.
만약에 두번째 줄처럼 Arrays.copyOf(arr, arr.length); 라고 작성하면, arr을 통째로 복사하는 것이다.
Arrays.copyOf(arr,3); 이렇게 복사하게 되면 arr배열에서 요소 3개만 복사하므로 [0, 1, 2]이렇게 복사가 될 것이다.
만약에 네번째 줄에 작성한 Arrays.copyOf(arr, 7);처럼 복사할 배열의 length보다 큰 값을 넣어주게 되면 초과요소에는 0이 들어간다.
copyOfRange()는 from to 방식이다.
즉, copyOfRange(복사할배열, from, to) 로 사용하면 된다. (to의 index는 포함되지 않음, to - 1 index까지만 포함)
다섯번째 줄을 보면, Arrays.copyOfRange(arr, 2, 4); 라고 작성했는데,
이 코드는 arr배열의 인덱스 2~3에 있는 요소값을 복사한다는 뜻이다. (arr, 2, 4)에서 to가 4여서 index4까지라고 착각하지 말도록하자.
Python을 사용했던 사용자라면, pyhton에서 array[from:to]를 떠올리면 될 것이다 이떄 to도 포함되지 않고 form~to-1의 인덱스만 포함되니 말이다.
그리고, copyOfRange(배열, from, to)도 마찬가지로 to에 복사할 배열의 length보다 큰 값을 넣어주게 되면 초과요소에는 0이 들어간다.
- 배열의 정렬 - sort()
이 메서드는 배열을 정렬해준다.
int[] arr = {3, 2, 0, 1, 4};
Arrays.sort(arr); // 배열 arr을 정렬한다.
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
arr배열에 [3, 2, 0, 1, 4]요소가 있다.
이것을 sort()메서드를 이용해서 Arrays.sort(arr); 해주게 되면, 배열 arr이 정렬된다.
Arrays.toString(arr));으로 이 배열을 출력해보면, [0, 1, 2, 3, 4] 이렇게 오름차순 정렬이 되어있는 것을 확인할 수 있다.