[자바] Iterable, Iterator, Comparable, Compartor
Iterable, Iterator
자바는 어떠한 자료 구조든 상관없이 동일한 순회 방법을 제공하기 위해 Iterable, Iterator 인터페이스를 제공한다.
Iterable 인터페이스 내부에는 iterator() 메서드가 있다. 그리고 Iterator에는 hasNext(), next() 라는 메서드가 존재한다.
public interface Iterable<T> {
Iterator<T> iterator();
}
public interface Iterator<E> {
boolean hasNext(); // 다음 요소가 있는지 확인
E next(); //다음 요소를 반환
}
즉 Iterable 인터페이스는 컬렉션 인터페이스의 상위에 존재하여 자바의 컬렉션들이 Iterator를 구현하게 하기 위함이다. 그리고 구현된 Iterator 내부에 다음 요소가 있는지 확인하는 메서드와 요소를 반환하는 메서드가 존재하므로 Iterable을 구현한 모든 컬렉션들은 향상된 for-each 문 사용이 가능하다.
public class ArrayList<E> implements List<E> {
...
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
private int cursor = 0;
private int lastRet = -1;
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public E next() {
int i = cursor;
if (i >= size) {
throw new NoSuchElementException();
}
cursor = i + 1;
return (E) elementData[lastRet = i];
}
...
}
...
}
Comparable, Comparator
자바에서는 정렬 기준을 정의하기 위해 필요한 기능을 제공하는 Comparable, Comparator 인터페이스를 제공한다.
- Compartor
- 두 값을 비교할 때 비교 기준을 직접 제공 가능
- 두 인수 o1, o2를 비교
- ex.. 오름차순 비교 시
- 첫 인수가 더 작다면 음수 반환. -1
- 같으면 0 반환
- 첫 인수가 더 크다면 양수 반환. 1
public interface Comparator<T> {
int compare(T o1, T o2);
}
- Comparable
- 객체에 비교 기능을 제공.
- 자기 자신과 인수로 넘어온 객체를 비교 후 반환
- 현재 객체가 인수보다 더 작다면 음수 반환. -1
- 두 객체의 크기가 같으면 0
- 현재 객체가 인수보다 더 크다면 양수 반환. 1
public interface Comparable<T> {
public int compareTo(T o);
}
즉 객체에 Comparable 인터페이스를 구현하면 구현된 Comparable이 해당 객체의 기본 정렬 방식이 된다.
따라서 Arrays.sort() 시에 해당 방식으로 기본 정렬을 하게 된다.
만약에 다른 정렬 방식을 추가하고 싶다면 해당 메서드에 Comparator()를 구현해서 인자로 같이 넘기면 된다.
참고
list.sort() vs Collections.sort()
list.sort()는 해당 자료구조 객체 자신이 정렬 메서드를 지니고 있으므로 더 객체지향적이며 비교적 더 최신 기능이므로 권장.
Arrays.asList() vs List.of()
Arrays.asList() → 고정된 크기, 가변임
List.of() 불변. 자바 9에 등장. 사용을 권장