will come true

[Java] Enumeration, Iterator, ListIterator 차이 본문

Java

[Java] Enumeration, Iterator, ListIterator 차이

haehyun 2021. 12. 18. 23:15
728x90

Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소에 접근하는 데 사용되는 인터페이스이다.

  • Enumeration : Iterator의 구버전, 사용X
  • Iterator : 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
  • ListIterator : Iterator에 양방향 조회기능 추가 (List인터페이스를 구현한 컬렉션에서만 사용 가능)

 

Iterator

Collection인터페이스 내에 선언된 iterator() 메서드 'Iterator 인터페이스를 구현한 클래스의 인스턴스'를 반환한다.

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

public interface Collection {
    ...
    public Iterator iterator();
    ...
}
메서드 설명
boolean hasNext() 읽어 올 요소가 남아있는지 확인
<T> next() 다음 요소를 읽어온다.
void remove() next()로 읽어 온 요소를 삭제 (next() 사용후에 호출해야 함) = 선택적 기능

 

List 혹은 Set은 이러한 Collection 인터페이스를 구현하고 있기 때문에 각 컬렉션에서 .iterator() 메서드를 호출할수 있으며, 그렇게 반환된 Iterator 인스턴스와 반복문을 사용해 컬렉션의 요소에 순차적으로 접근할 수 있다.

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

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        Iterator<Integer> it = list.iterator();

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

 

ListIterator

Iterator는 단방향으로만 이동할 수 있으나, ListIterator는 양방향으로 이동 가능.

메서드 설명
(Iterator 인터페이스 메서드 포함)
void add(T e) 컬렉션에 새로운 객체를 추가
boolean hasPrevious() 읽어 올 이전 요소가 남아있는지 확인
T previous() 이전 요소를 읽어온다
int nextIndex() 다음 요소의 index 반환
int previousIndex() 이전 요소의 index 반환
void remove() next() 또는 previous()로 읽어온 요소 삭제
void set(T e) next() 또는 previous()로 읽어 온 요소를 지정된 객체로 변경

 

ArrayList는 List인터페이스를 구현한 컬렉션이기 때문에 listIterator() 메서드가 존재하며 이를 통해 ListIterator 인스턴스를 반환받아 순차 / 역순으로 요소에 접근할 수 있다.

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

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        ListIterator<Integer> it = list.listIterator();
        
        // 순차 접근
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println();
        
        // 역순 접근
        while (it.hasPrevious()) {
            System.out.println(it.previous());
        }
    }
}

 

remove() 메서드

Iterator 인터페이스의 remove() 메서드는 '선택적 기능'이라고 명시되어 있는데, 이는 Iterator 인터페이스를 구현하는 컬렉션 클래스에서 remove() 메서드를 반드시 구현한 필요는 없다는 뜻이다. 

예를 들어 Iterator인터페이스를 구현하는 MyVector2라는 클래스를 선언한 뒤 [Implement methods] 를 선택하면, hasNext() next() 메서드만 기본 선택되어 있다. (필수로 구현해야되는 메서드들)

 


[참고]

  • Java의 정석 3rd, 남궁 성, 도우출판
728x90
Comments