관리 메뉴

제뉴어리의 모든것

Chapter 11. Iterator, ListIterator, Enumeration 본문

JAVA/자바의정석

Chapter 11. Iterator, ListIterator, Enumeration

제뉴어리맨 2022. 7. 10. 14:41

 Iterator, ListIterator, Enumeration란 무엇인가

Collection 인터페이스를 구현한 구현체들에 저장된 데이터들을 접근하는 방법을 제공하는 인터페이스.

쉽게 말해서, Collection 인터페이스 구현체들의 데이터에 접근하는 방법을 통일시켜 제공하는 인터페이스란 말이다.

그리고 그러한 인터페이스를 구현한 구현체를 각 Collection 구현체인 객체들에게 반환받아 사용하면 된다.

(그냥 Collection 구현체 객체에서 Iterator, ListIterator, Enumeration 중 하나의 구현체 객체 리턴받아 그거 사용하면 데이터에 접근 가능하단 말이다)

 

Iterator

  • 주요 메서드
    : boolean hasNext()

    : Object next() - 사용전 hasNext()로 다음 데이터 존재유무 확인하고 사용해야 안전하다.

    : void remove() - next()를 호출한 다음에 remove를 호출해야 에러가 발생하지 않는다 (Iterator 구현체의 내부적으로 이전에 읽어 온 데이터를 지우는 형식이므로 아무런 데이터도 읽지 않은 뒤 사용하면 에러 발생)

ListIterator (List를 구현한 경우만 사용가능)

Iterator 인터페이스를 상속받아 기능을 추가한 인터페이스로써 Iterator가 데이터 접근시에
단방향만 가능하던 방식을 개선한것으로 양방향으로 접근이 가능하다. 즉, 현재 위치에서 다음 데이터, 이전 데이터의 접근이 가능하다.

  • 주요 메서드
    : Object previous() - 이전 데이터 가져오기

    : boolean hasPrevious() - 이전 데이터 존재 유무 리턴

    : void remove() - next() 혹은 previous() 를 호출한 다음에 remove를 호출해야 에러가 발생하지 않는다 (ListIterator 구현체의 내부적으로 이전에 읽어 온 데이터를 지우는 형식이므로 아무런 데이터도 읽지 않은 뒤 사용하면 에러 발생)

    : void set (Object o) - next() 또는 previous() 로 읽어 온 요소를 지정된 객체로 변경해야 한다. 반드시 next() 혹은 previous()를 호출한 뒤 set() 메서드를 호출해야한다.

Enumeration

Iterator의 구버전이므로 웬만하면 Iterator 또는 ListIterator를 사용하자.

 

Iterator, ListIterator 사용

  • 코드

package ch11.practice.subPractice;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class IteratorPractice {
    public static void main(String[] args) {

        ArrayList arrayList = new ArrayList();

        arrayList.add(45);
        arrayList.add(4);
        arrayList.add(23);
        arrayList.add(2);
        arrayList.add(100);


        Iterator iterator = arrayList.iterator();
        System.out.println("========= Iterator =========");
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

//        int value = (int)iterator.next(); //에러, 이미 컬랙션의 데이터를 끝까지 읽어 온 iterator 이기 때문에 다시 생성해서 사용해야한다
        Iterator newIterator = arrayList.iterator();

//        while (newIterator.hasNext()) {
//            newIterator.remove();        //에러, remove는 iterator 내부적으로 읽어 왔던 데이터를 삭제하므로 next 없이 사용하면 에러발생
//        }

        System.out.println("========= Iterator =========");
        System.out.println();
        System.out.println("========= ListIterator =========");
        ListIterator listIterator = arrayList.listIterator();

        while (listIterator.hasNext()) {
            System.out.println(listIterator.next());
        }

        System.out.println("==================");
        while (listIterator.hasPrevious()) {
            System.out.println(listIterator.previous());  //ListIterator는 데이터의 끝까지 갔어도 previous로 이전 데이터 탐색가능
        }
        System.out.println("========= ListIterator =========");
    }
}

 

  • 결과