Java
[Java] Enumeration, Iterator, ListIterator 차이
haehyun
2021. 12. 18. 23:15
728x90
Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소에 접근하는 데 사용되는 인터페이스이다.
- Enumeration : Iterator의 구버전, 사용X
- Iterator : 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
- ListIterator : Iterator에 양방향 조회기능 추가 (List인터페이스를 구현한 컬렉션에서만 사용 가능)
Iterator
Collection인터페이스 내에 선언된 iterator() 메서드는 'Iterator 인터페이스를 구현한 클래스의 인스턴스'를 반환한다.
public interface Iterator{
boolean hasNext();
Object next();
void remove();
}
public interface Collection {
...
public Iterator iterator();
...
}
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 확인 |
<T> next() | 다음 요소를 읽어온다. |
void remove() | next()로 읽어 온 요소를 삭제 (next() 사용후에 호출해야 함) = 선택적 기능 |
List 혹은 Set은 이러한 Collection 인터페이스를 구현하고 있기 때문에 각 컬렉션에서 .iterator() 메서드를 호출할수 있으며, 그렇게 반환된 Iterator 인스턴스와 반복문을 사용해 컬렉션의 요소에 순차적으로 접근할 수 있다.
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
ListIterator
Iterator는 단방향으로만 이동할 수 있으나, ListIterator는 양방향으로 이동 가능.
메서드 | 설명 |
(Iterator 인터페이스 메서드 포함) | |
void add(T e) | 컬렉션에 새로운 객체를 추가 |
boolean hasPrevious() | 읽어 올 이전 요소가 남아있는지 확인 |
T previous() | 이전 요소를 읽어온다 |
int nextIndex() | 다음 요소의 index 반환 |
int previousIndex() | 이전 요소의 index 반환 |
void remove() | next() 또는 previous()로 읽어온 요소 삭제 |
void set(T e) | next() 또는 previous()로 읽어 온 요소를 지정된 객체로 변경 |
ArrayList는 List인터페이스를 구현한 컬렉션이기 때문에 listIterator() 메서드가 존재하며 이를 통해 ListIterator 인스턴스를 반환받아 순차 / 역순으로 요소에 접근할 수 있다.
import java.util.ArrayList;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> it = list.listIterator();
// 순차 접근
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println();
// 역순 접근
while (it.hasPrevious()) {
System.out.println(it.previous());
}
}
}
remove() 메서드
Iterator 인터페이스의 remove() 메서드는 '선택적 기능'이라고 명시되어 있는데, 이는 Iterator 인터페이스를 구현하는 컬렉션 클래스에서 remove() 메서드를 반드시 구현한 필요는 없다는 뜻이다.
예를 들어 Iterator인터페이스를 구현하는 MyVector2라는 클래스를 선언한 뒤 [Implement methods] 를 선택하면, hasNext()와 next() 메서드만 기본 선택되어 있다. (필수로 구현해야되는 메서드들)
[참고]
- Java의 정석 3rd, 남궁 성, 도우출판
728x90