기록과 정리

Iterator/ListIterator/Enumeration 란? 본문

IT/Java

Iterator/ListIterator/Enumeration 란?

zepetto 2021. 7. 30. 18:02

이 글은 남궁성님의 '자바의 정석 (3판)'을 참고하였습니다.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788994492032 

 

Java의 정석 - 교보문고

최신 Java 8.0 포함 | [책소개]최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 '자바의 정석'의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을

www.kyobobook.co.kr

 

Iterator/ListIterator/Enumeration 란?

 

Iterator / ListIterator / Enumeration 은 컬렉션 요소에 접근하는 데 사용하는 인터페이스다.

 

Iterator

자바에 컬렉션 프레임워크가 도입이 되면서 컬렉션에 접근하는 방법을 표준화할 필요가 생겼고 , Iterator 인터페이스는 그중에 하나의 방법이다. Enumeration은 Iterator의 구버전이라고 생각하면 되고, 가급적 Iterator을 사용하도록 하자.

 

메서드 

  • boolean hasNext() : 읽어올 요소가 있는지 확인. 있으면 true, 없으면 false
  • Object next() : 다음 요소가 있는지 확인. next()를 호출하기전 hasNext()로 확인해주어야 RuntimeException을 피할 수 있다.
  • void remove() : next()에서 가져온 요소를 삭제한다. remove의 경우, 단독으로 쓰일 수 없고 next()와 같이 써야 함. 특정 요소를 삭제하는 것이 아닌 읽어 온 것을 삭제한다. next() 호출 없이 remove()를 호출 시 IllegalStateException이 발생한다.

 

Iterator 사용 예시

참고) Collection으로 참조변수를 선언하게 되면 ArrayList가 아닌 LinkedList로 변경해야 할 경우, 선언문 하나만 변경만 하면 된다. 나머지 코드는 검토하지 않아도 된다. (무조건은 아님).

 

위에서 List 인터페이스의 경우, 그냥 사용하면 되지만..Map은 iterator를 직접적으로 호출할 수 없어 Set의 형태로 변환시켜 다시 iterator를 호출해야 한다.

Map을 Set으로 변환
결과값

remove()

remove()의 경우, 선택적 기능이라 하여 Iterator 구현하는 클래스에 꼭 구현해야 하는 것은 아니다. 

Iterator를 구현하는 InnerIterator 클래스

인터페이스로부터 상속받는 메서드는 추상 메서드라 몸통(body)을 반드시 만들어주고 UnsupportedOperationException을 throw 해주어야 한다. 그렇지 않으면 소스를 찾아보기 전까진 다른 개발자에게 동작하지 않는 이유를 쉽게 알려주기 어렵기 때문이다.

UnsupportedOperationException 발생

 

ListIterator와 Enumeration

  1. Enumeration : Iterator의 구버전
  2. ListIterator : List를 구현한 경우에만 한정된 양방향 조회 기능을 가진 Iterator

 

위에서 언급한 바와 같이 Enumeration의 메서드에는 

  • boolean hasMoreElements() : 읽어올 요소가 있는지 확인. 있으면 true, 없으면 false. Iterator의 hasNext()와 같다.
  • Object nextElement() : 다음 요소를 읽어 들인다. Iterator의 next()와 같다.

 

ListIterator는 조금 많은 관계로 몇 가지만 소개해 보면

  • Object previous() : 이전 요소를 읽어 온다. 
  • Object next() : 다음 요소를 읽어 온다.
  • int previousIndex() : 이전 요소의 index를 반환한다.
  • int nextIndex() : 다음 요소의 index를 반환한다.

양방향으로 이동 가능하기 때문에 각 요소 이동이 조금 더 쉽다. 다만 List를 구현했을 경우에만 한정적이다.

 

 

 

'IT > Java' 카테고리의 다른 글

Java8 Stream API (스트림 API)  (0) 2021.08.12
기본 메서드와 스태틱 메서드  (0) 2021.08.03
람다표현식&메소드 레퍼런스  (0) 2021.07.26
Java 함수형 인터페이스  (0) 2021.07.20
가비지 컬렉션 (Garbage Collection) GC란?  (0) 2021.02.02