[JAVA] 컬렉션 프레임 워크 - Iterator, ListIterator, Enumeration

DANI·2023년 12월 10일
0

JAVA를 공부해보자

목록 보기
19/29
post-thumbnail

📕 Iterator, ListIterator, Enumeration란?

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

📝 Iterator

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

iterator()Collection 인터페이스에 정의된 메서드이므로 Collection 인터페이스의 하위 인터페이스인 ListSet에도 포함되어 있으며, 각 컬렉션의 특징에 알맞게 작성되어 있다.

🔵 예시

List list = new ArrayList();
Iterator it = list.iterator();
// 다음 요소가 있는지?
while(it.hasNext()) {
	System.out.println(it.next()); // 다음 요소를 읽어온다
    it.remove(); // 읽어 온 요소를 삭제한다
}

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



📝 ListIterator

Iterator를 상속받아서 기능을 추가한 것으로 Iterator는 단방향으로만 이동할 수 있는데 반해 ListIterator는 양방향으로의 이동이 가능하다.
ArrayList, LinkedList와 같이 List인터페이스를 구현한 컬렉션에서만 사용할 수 있다.



💾 IteratorEx1

/**
 * 1. 작성자 : Dani
 * 2. 작성일 : 12월 10일
 * 3. Iterator 기본 문법
 */
package Basics;

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

public class IteratorEx1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("이름1");
        list.add("이름2");
        list.add("이름3");
        list.add("이름4");

        /**
         * 요소 불러오기
         * 재사용X
         */
        /*
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){ // 다음 요소가 있는지?
            System.out.println(iterator.next()); // 다음요소 읽어오기
            iterator.remove(); // 요소 삭제
        }
        System.out.println("요소의 개수 : " + list.size()); // 0 전부 삭제 됐다.
        */

        /**
         * Iterator의 향상된 버전
         * 양방향으로 조회 가능
         * List 인터페이스를 구현한 컬렉션 클래스
         */
        ListIterator<String> stringListIterator = list.listIterator();
        while (stringListIterator.hasNext()){
            System.out.println(stringListIterator.next());
        }

        while (stringListIterator.hasPrevious()){
            System.out.println(stringListIterator.previous());
        }
    }
}

🔵 실행결과

이름1
이름2
이름3
이름4
이름4
이름3
이름2
이름1



📝 Enumeration

컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator의 구버전이다.
이전 버전으로 작성된 소스와의 호환을 위해 남겨둔 것

🔵 예시

// 다음 요소가 있는지?
while(it.hasMoreElements()()) {
	System.out.println(it.nextElement()); // 다음 요소를 읽어온다
}


💾 IteratorEx


package Iterator;

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

public class IteratorEx {
    public static void main(String[] args) {
        ArrayList orginal = new ArrayList<>(10);
        ArrayList copy1 = new ArrayList<>(10);
        ArrayList copy2 = new ArrayList<>(10);

        for (int i=0; i<10; i++){
            orginal.add(i);
        }

        Iterator iterator = orginal.iterator();
        while (iterator.hasNext()){
            copy1.add(iterator.next());
        }

        System.out.println("==original -> copy1 복사==");
        System.out.println("original : " + orginal);
        System.out.println("copy1 : " + copy1);
        System.out.println();

        
        iterator = orginal.iterator(); // 재사용이 안되므로 다시 얻어와야 함
        while (iterator.hasNext()){
            copy2.add(iterator.next());
            iterator.remove();
        }

        System.out.println("==original -> copy2 복사==");
        System.out.println("copy1 : " + copy1);
        System.out.println("original : " + orginal);
        System.out.println();
    }
}

🔵 실행결과

==original -> copy1 복사==
original : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
copy1 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

==original -> copy2 복사==
copy1 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
original : []



0개의 댓글