본문 바로가기
프로그래밍언어/Java

[자바의 정석] 11. 컬렉션 프레임웍 - Iterator, ListIterator, Enumeration

by qkzkdo 2023. 8. 6.
728x90

1.5 Iterator, ListIterator, Enumeration

컬렉션에 저장된 요소를 접근(읽어오기)하는데 사용되는 인터페이스

Enumeration - Iterator의 구버전 / Listlterator - Iterator의 기능을 향상 시킨 것

 

Iteerator

컬렉션 프레임웍에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다.

컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의하고, 컬렉션 인터페이스에는 ‘Iterator(Iterator를 구현한 클래스의 인스턴스)’를 반환하는 iterator()를 정의하고 있다.

public interface Iterator{
	boolean hasNext();
	Object next();
	void remove();
}
public interface Collection{
	...
	public Iterator iterator();
	...
}

 

 

iterator()는 Collection인터페이스에 정의된 메서드이므로 Collection인터페이스의 자손인 List와 Set에도 포함되어 있다. 그래서 List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 알맞게 작성되어 있다.

컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음 반복문, 주로 while문을 사용해서 컬렉션 클래스의 요소들을 읽어 올 수 있다.

 

[Iterator인터페이스의 메서드]

메서드 설명
boolean hasNext() 읽어 올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
Object next() 다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.
void remove() next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야한다.(선택적 기능)

 

ArrayList에 저장된 요소들을 출력하기 위한 코드

Collection c = new ArrayList(); //다른 컬렉션으로 변경시 이 부분만 고치면 된다.
Iterator it = c.iterator();

while(it.hasNext()){
	System.out.println(it.next());
}
it = c.iterator(); //Iterator는 재사용이 안되므로, 다시 얻어와야 한다.

 

 

Map인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 쌍(pari)으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시 iterator()를 호출해야 Iterator를 얻을 수 있다.

Map map = new HashMap();
	...
Iterator it = map.entrySet().iterator();
//아래의 두 문장을 합친 것
Set eSet = map.entrySet();
Iterator it = eSet.iterator();

 

 

ListIterator와 Enumeration

Enumeration : Iterator의 구버전
ListIterator : Iterator에 양방향 조회기능추가(List를 구현한 경우만 사용가능)

 

 

 

출처 : 남궁성. 「자바의 정석」. 도우출판. 2016

728x90