Iterator, ListIterator, Enumeration

jaehun_dev·2022년 12월 29일
0

Java

목록 보기
4/6

Iterator, ListIterator, Enumeration

Collection(List, Set) 인터페이스에 저장된 데이터에 접근할 때 사용되는 인터페이스다.
Iterator가 주로 사용되며, Enumeration은 Iterator의 구버전이다. (기능은 거의 동일하다)
Iterator는 next로만 접근 가능하지만, ListIterator는 previous로의 접근도 가능하다.
컬렉션을 구현한 클래스는 LinkedList, ArrayList, HashSet 등 여러 종류가 있는데 이것들을 읽는 방법을 iterator를 통해 표준화하여 모두 동일한 방식으로 읽을 수 있다.
❗️Iterator는 1회성이다. (previous로 못가기 때문에 한번 순회한다면 새로운 iterator가 요구된다.)

hasNext()

컬렉션에 읽어올 요소가 남아있는지 확인한다. 있다면 true, 없다면 false

next()

다음 요소를 읽어 온다. hasNext()를 통해 읽어올 요소가 있다면 next()를 사용하여 다음 요소를 가져올 수 있다.

List list = new ArrayList();
list.add(1); list.add(2); list.add(3);
Iterator it = list.iterator();	//iterator(): Collection 인터페이스에 정의된 함수
while (it.hasNext()){
	System.out.print(it.next()+" ");	//1 2 3
}

Iterator의 사용 이유?

ArrayList를 다음과 같이 순회한다고 가정하자.

List list = new ArrayList();
for (int i=0; i<5; i++)
	list.add(i);	//0,1,2,3,4
for (int i=0; i<5; i++){
	Object obj = list.get(i);
    System.out.println(obj);
}

현재 상태에서는 for문에서의 list.get() 메소드를 사용하여도 List를 순회할 때 문제가 없다. 그러나 데이터를 담던 자료구조를 ArrayList에서 HashSet으로 바꾼다면 다음과 같은 문제점이 나타난다.

Set list = new HashSet();
for (int i=0; i<5; i++)
	list.add(i);	//0,1,2,3,4
/*
HashSet은 ArrayList와 달리 get 메서드를 지원하지 않는다. 에러!
for (int i=0; i<5; i++){
	Object obj = list.get(i);
    System.out.println(obj);
}
*/

그러나 만약 Iterator를 통해 순회하였다면 이러한 문제점을 고려하지 않아도 되며 유지 보수 및 코드의 재사용성이 높아진다.

List list = new ArrayList();
//Set list = new HashSet();
for (int i=0; i<5; i++)
	list.add(i);	//0,1,2,3,4
Iterator it = list.iterator();	//iterator() 메서드는 Collection에서 정의한 메서드이기 때문에 list와 set 모두 지원한다.
while(it.hasNext()){
	System.out.println(it.next());
}
profile
취업준비생/코딩&프로젝트 같이 하실분 연락주세요

0개의 댓글