Iterator는 무엇이고 어떻게 사용할까?
Enumeration / Iterator / ListIterator
--
컬렉션에 저장된 데이터에 접근하기 위해 사용되는 인터페이스로
컬렉션 요소를 순회하는 데 사용된다.
Enumeration
컬렉션의 요소를 읽는 기본적인 방법을 제공하는 인터페이스로
요소를 읽기만 가능하며, 수정 기능이 없다.
일반적으로 Vector, Hashtable 같은 레거시 컬렉션에서 사용된다.
현재는 "Iterator"로 대체되어 사용되지 않는다.
즉, Enumeration은 Iterator의 구버전이라고 할 수 있다.
Enumeration의 메서드
Iterator와 ListIterator
- Iterator : Enumeration을 대체하며 컬렉션 요소를 순회하고 수정도 가능
- ListIterator : 기존 Iterator를 확장한 버전 (List에 특화된 양방향 기능 제공)
간단하게 생각하면 Iterator는 "단방향"으로만 순회하여 접근이 가능했지만
ListIterator는 "양방향"으로 순회하여 접근이 가능하다.
다만 ListIterator는 "List"인터페이스를 구현한 컬렉션에만 사용이 가능하다.
물론 Iterator는 모든 컬렉션 클래스에서 사용할 수 있다.
여기서 단순히 컬렉션의 요소에 접근하기 위한 용도가 아닌
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것이다.
표준화를 통해 컬렉션의 종류에 관계없이 동일한 방식으로 컬렉션의 요소에 접근이 가능해진다.
Iterator의 메서드
ListIterator의 메서드
Iterator
Iterator를 통해 컬렉션에 접근하려면
컬렉션에서 제공하는 Iterator()를 호출하여 iterator를 구현한 객체를 얻은 후 사용할 수 있다.
public interface Collection {
...
public Iterator iterator();
...
}
컬렉션 인터페이스에서 iterator()를 제공한다.
예제 코드
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
// iterator 생성
Iterator it = list.iterator();
System.out.println(it.next()); // 1
System.out.println(it.next()); // 2
System.out.println(it.next()); // 3
System.out.println(it.next()); // 4
System.out.println(it.next()); // 5
//만약 접근 도중 값이 추가되면?
System.out.println(it.next()); // 1
list.add("5"); // 예외발생!!
System.out.println(it.next()); // Iterator로 ArrayList에 접근하는 도중에
System.out.println(it.next()); // ArrayList가 변경이 되어 발생한 것이다.
System.out.println(it.next()); // 그래서 접근하는 도중 추가나, 삭제가 발생하면 안됨
System.out.println(it.next());
// 만약 존재하는 요소보다 많이 호출하면?
System.out.println(it.next()); // 1
System.out.println(it.next()); // 2
System.out.println(it.next()); // 3
System.out.println(it.next()); // 4
System.out.println(it.next()); // 5
System.out.println(it.next()); // 더 이상 요소가 없어서 에러 발생!!
// 그래서 안전하게 while문을 사용하여 호출한다.
while(it.hasNext()) { // 요소가 남아있는 동안 반복
System.out.println(it.next());
}
// jdk1.8부터 Iterator에 forEachRemaining()메서드가 추가되었다.
// 이 메서드를 사용하면 위에 문장을 한 문장으로 작성이 가능하다.
// forEachRemaining()메서드는 컬렉션의 각 요소에 특정 작업을 수행하는 메서드이다.
it.forEachRemaining(System.out::println);
// System.out::println를 통해 화면에 출력하는 작업을 한다.
// 이 메서드는 람다식을 이용하는 메서드이며 System.out::println은 람다식이다.
ListIterator
Iterator의 접근성을 "단방향"에서 "양방향"으로 향상시킨 것이다.
즉, ListIterator는 Iterator의 자식이다.
public interface ListInterator extends Iterator {
...
}
List 인터페이스에서 ListIterator()를 제공한다.
public interface List extends Collection {
...
ListIterator listIterator();
...
}
List 인터페이스에서 제공하기 때문에
다른 컬렉션에서는 ListIterator를 사용할 수 없다.
예제 코드
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
ListIterator it = list.listIterator();
while(it.hasNext()) {
System.out.println(it.next());
}
while(it.hasPrevious()) {
System.out.println(it.previous());
}
/*
------------결과-------------
1
2
3
4
5
5
4
3
2
1
-----------------------------
*/
--
'Language > Java' 카테고리의 다른 글
Arrays 클래스에서 제공하는 메서드 (0) | 2024.12.25 |
---|---|
[Java] Stack과 Queue 사용하기 (1) | 2024.12.20 |
Vector, ArrayList, LinkedList (0) | 2024.12.18 |
컬렉션 프레임워크 ( List, Set, Map ) (0) | 2024.12.11 |
[java.lang] Math 클래스 (수학적 계산 관련 클래스) (0) | 2024.11.05 |