본문 바로가기

언어공부/Java

자바 Iterator, ListIterator, Enumeration

자바 Iterator, ListIterator, Enumeration에 대해서 알아보자.

 

Iterator, ListIterator, Enumeration은 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.  Enumeration(JDK 1.0)은 Iterator(JDK 1.2)의 구버전이며, ListIterator는 Iterator의 기능을 향상 시킨 것이다.

** Enumeration/iterator/tokenizer는 한번만 사용됨. nextElement()로 한번 사용되면 없어지기 때문에  다른 객체주소를 새로 만들어 저장하는것이 좋다.

Iterator

컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스. Collection인터페이스에는 'Iterator를 구현한 클래스의 인스턴스'를 반환하는 iterator()를 정의하고 있다. iterator()는 Collection인터페이스에서 정의된 메소드이므로 Collection인터페이스의 자손인 List와 set에도 포함되어 있다. 그러나 List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 알맞게 작성되어 있다.

 

컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음 반복문, 주로while문을 사용해서 컬렉션 클래스의 요소들을 읽어 올 수 있다. (Map인터페이스를 구현한 컬렉션 클래스는 키와 값을 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메소드를 사용해야한다. 나중 포스팅 참고)

 

ex)

 

List클래스들은 Iterator대신 for문 같이 get()으로도 모든 요소들을 출력할 수 있다.

 

출력화면

 

ArrayList대신 List인터페이스를 구현한 다른 컬렉션 클래스에 대해서도 이와 동일한 코드를 사용할 수 있다. Iterator를 이용해서 컬렉션의 요소를 읽어오는 방법을 표준화했기 때문에 이처럼 코드의 재사용성을 높이는 것이 가능하다. 이처럼 공통 인터페이스를 정의해서 표준을 정의하고 구현하는 표준을 따르도록 함으로써 코드의 일관성을 유지하여 재사용성을 극대화하는 것이 객체지향 프로그래밍의 중요한 목적중의 하나이다.

 


ListIterator

ListIterator는 Iterator의 기능을 향상 시킨 것으로 Iterator에 양방향 조회기능을 추가했다.(List를 구현한 경우만 사용가능)

 

ex)

 

출력화면

 


Enumeration

Iterator의 구버전. (Enumeration(JDK 1.0)은 Iterator(JDK 1.2))

같은 JDK1.0버전에서 나온 Vector컬렉션과 잘 맞는다.

 

ex)

 

출력화면.

 

List클래스들은 저장순서를 유지하기 때문에 Iterator를 이용해서 읽어 온 결과 역시 저장순서와 동일하지만, Set클래스들은 각 요소간의 순서가 유지되지 않기 때문에 Iterator를 이용해서 저장된 요소들을 읽어와도 처음에 저장된 순서와 같지 않다.