본문 바로가기

프로그래밍/Java

Arrays, Comparable, Comparator에 대해

 Arrays

- 배열을 다루기에 편리한 메소드들(static)을 제공한다.


Arrays 클래스의 메소드

- toString()

배열을 출력한다. boolean[], byte[], char[] 등 여러 자료형들에 대한 출력을 폭넓게 지원한다.

- deepToString(), equals(), deepEquals()

다차원 배열에서 비교와 출력을 할 때 쓰인다. deepToString과 deepEquals는 다차원배열에서 각각 출력과 비교를 담당하며 equals는 1차원 배열에서의 비교를 수행한다.

- copyOf(), copyOfRange()

배열을 복사할 때 쓰인다. copyOf는 처음부터 지정된 곳까지 저장을 하며 copyOfRange는 지정된 곳부터 지정된 곳까지 저장을 한다. 만일 기존 배열의 크기를 넘어서는 인덱스까지 저장하도록 명령을 할 경우 넘어서는 범위의 값은 해당 자료형의 기본값이 저장된다.

이들 메소드는 복사만 하는 것이 아니라 추가적으로 생성을 해주는 기능이 있어 System.arrayCopy()메소드보다 더 유용한 편이다.

- fill(), setAll()

배열을 채우고자 할 때 쓰인다. 가령 fill(arr, 5)라고 한다면 arr배열에 모든 요소를 5로 채우게 된다. 이 때 기존에 저장되어있던 데이터들은 덮어씌워진다.

setAll메소드는 배열을 람다식을 이용하여 채우게 된다.

ex) Arrays.setAll(arr, () -> (int)(Math.Random() * 5) + 1) : arr배열을 1부터 5까지의 무작위 수로 채워라

- asList(Object... a)

배열을 List(컬렉션)으로 변환할 때 쓰인다. 이 때 주의할 점은 반환되는 List가 읽기 전용이라는 것이다. 변경을 원한다면 새로운 List를 생성하여야 한다. 

- sort(), binarySearch()

각각 배열의 정렬과 검색 역할을 수행한다. 단, binarySearch메소드는 정렬된 배열의 요소만 검색하기 때문에 이 메소드를 사용하기 전에 sort등을 이용하여 배열을 우선 정렬해주어야 한다.


* 이진 검색, 순차 검색

- 순차 검색

처음부터 순서대로 검색한다.

- 이진 검색(이분 검색, binary search)

범위를 절반으로 계속 나누며 검색을 한다. 이진 검색을 사용하기 위해서는 사용 전 정렬을 필수적으로 수행해야 한다.

검색할 배열의 크기가 커질 수록 점점 순차검색보다 효율이 늘어난다.


Comparator와 Comparable

- 정렬을 하고자 할 때 배열은 Arrays.sort()메소드를, 컬렉션은 Collections.sort()메소드를 이용하여 정렬하면 된다.

- 객체를 정렬할때는 sort만으로는 부족하며 정렬에 대한 기준까지 지정해야 완벽하게 정렬이 가능해진다.

- Comparator와 Comparable 인터페이스는 객체를 정렬하는데 필요한 메소드를 정의하여 정렬 기준을 제공해준다.

- Comparable은 기존 정렬 기준을 구현할 때 사용된다.

- Comparator은 정렬 기준 외 다른 기준을 통해 정렬하고자할 때 사용된다.


* 정렬

- 두 값을 비교하여 자리 바꿈을 반복하는 것

- 버블정렬, 선택정렬, 삽입정렬, 퀵정렬, 쉘정렬 등이 있다.

버블정렬 예)

 static void sort(Object[] objArr) {

for (int i = 0; i < objArr.length - 1; i++) {

for (int j = 0; j < objArr.length - 1; j++) {

Comparable c = (Comparable)objArr[j];

Comparable c2 = (Comparable)objArr[j + 1];

if (c.compareTo(c2) > 0) {

Object temp = objArr[j];

objArr[j] = objArr[j + 1];

objArr[j + 1] = temp;

}

}

}

}

'프로그래밍 > Java' 카테고리의 다른 글

Properties와 Collections에 대해  (0) 2019.05.02
HashMap과 TreeMap에 대해  (0) 2019.04.25
Iterator와 Enumeration, ListIterator에 대해  (0) 2019.04.25
Stack과 Queue에 대해  (0) 2019.04.22
Collection framework에 대해 (3)  (0) 2019.04.21