[Java] Iterator | Enumeration

JTI·2022년 12월 7일
0

☕️  Java

목록 보기
41/59
post-thumbnail

💡Iterator(신ver) / Enumeration(구ver)


✔️ 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스

public interface Collection {
	...
    public Iterator iterator();
    ...
}

Collection의 List / Set / Map 등등 구조가 다 다르다.

하지만 IteratorEnumeration 은 이들의 구조가 어떻든 간에 표준화하며 확인하고 읽어온다.

// 다른 Collection으로 변경할 때는 첫줄 부분만 고치면 된다.
List list = new ArrayList();
Iterator it = list.iterator();

while(it.hasNext()) { // 읽어올 요소가 있는지 확인
	System.out.println(it.next()); // 다음 요소를 읽어옴
}

✏️ Iterator 메서드

✏️ boolean hasNext()

  • 읽어 올 요소가 남아있는지 확인한다.
  • 있으면 true, 없으면 false를 반환한다.

✏️ Object next()

  • 다음 요소를 읽어온다.
  • next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.

Collection의 요소들을 읽어올 수 있을 때까지 계속 돈다.
읽어올 것이 없으면 false가 돼서 멈춘다.

✏️ Enumeration 메서드

✏️ boolean hasMoreElements()

  • 읽어 올 요소가 남아있는지 확인한다.
  • 있으면 true, 없으면 false를 반환한다.
  • Iterator의 hasNext()와 같다.

✏️ Object nextElement()

  • 다음 요소를 읽어온다.
  • nextElement()를 호출하기 전에 hasMoreElements()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.
  • Iterator의 next()와 같다.

Enumeration은 구버전이기 때문에 신버전인 Iterator를 더 많이 쓰고 지향한다.

💡 Iterator 활용


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

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

        Iterator it = list.iterator();

        while(it.hasNext()) {
            System.out.println(it.next());
        }
        // 1회용
        it = list.iterator(); //  새로운 iterator를 얻는다.
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

Iterator는 1회용이기 때문에 한번 더 출력할려면 Iterator를 다시 얻어와야 한다.

❓ 반복문이랑 차이가 뭘까?

 for(int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
 }

반복문을 사용해서 읽어오면 되지 왜 Iterator 를 사용하는걸까?

예제를 좀 바꾸어서 ArrayListHashSet 으로 바꿔보겠다.

import java.util.HashSet;
import java.util.Iterator;

public class IteratorTest {
    public static void main(String[] args) {
        HashSet list = new HashSet(); // Set은 Collection의 자손
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");

        Iterator it = list.iterator();

        while(it.hasNext()) {
            System.out.println(it.next());
        }
        for(int i = 0; i < list.size(); i++) {
        	// HashSet은 get()가 없다. 그래서 동작하지 않는다.
            System.out.println(list.get(i)); // Error
        }

    }
}

HashSetget() 이 없어서 반복문으로 읽어오기에는 한계가 있다.

Iterator 는 Collection에 지정된 데이터를 접근가능하기 때문에 HashSet 도 읽어오기 가능하다.

💡 Map과 Iterator


❌ Map에는 iterator() 가 없다.

Map은 Collection의 자손이 아니기 때문에, iterator()가 없다.

✔️ keySet(), entrySet(), values()를 호출하여 iterator를 불러옴

keySet(), entrySet() : Set
values() : Collection

Map map = new HashMap();

Set eSet = map.entrySet();
Iterator it = eSet.iterator();

// Iterator it = map.entrySet().iterator();

References
: https://cafe.naver.com/javachobostudy

profile
Fill in my own colorful colors🎨

0개의 댓글