컬렉션_Iterator

2024. 2. 17. 19:16JAVA

Iterator ? 

Iterator 라는 인터페이스가 있다. 이 인터페이스의 목적은 ' 컬렉션에 담긴 요소들을 읽어오는 것'이다.

Iterator 는 Collection 인터페이스에 포함 돼 있다. (-> collection 의 sub class 라면 다들 Iterator를 갖는다)

 

주요 메서드

Iterator의 주요 목적은 컬렉션의 요소 값을 갖고 오는 것이라 했다.

하여 주요 메서드로는

boolean hasNext() - 다음 요소가 있는지 확인한다. 다음 요소가 있다면 true, 없다면 false

Obejct next() - 다음 요소가 있다면 가져온다.

public class IteratorEx {
    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 iterator = list.iterator();

        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }

        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }
    }
}

Iterator 은 1회성을 띄고 있다.

위의 예제에서

첫 번째 while(iterator.hasNext(){} 를 통해 컬렉션의 값을 모두 읽었으므로, 두 번째 while 문은 동작하지 않는다.

이미 끝까지 돌아 다음 요소값을 같지 않으므로.

 

따라서, 처음부터 컬렉션의 요소값을 읽어오기 위해서는 

lterator = list.iterator();

를 통해 새롭게 Iterator를 생성해야 한다.

// 결과값 - 1 2 3 4 5
while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }

// 결과값 - 없음
        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }

        System.out.println("================");
// 결과값 - 1 2 3  4 5
        iterator = list.iterator();
        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }

 

Iterator 를 사용하는 이유

상기의 코드는 우리가 아주 생 기초때부터 자주 봐오던 반복문 for문으로도 같은 결과값을 낼 수 있다.

// 위의 while문과 결과값은 같다.
for (int i = 0; i < list.size(); i++) {
    Object obj = list.get(i);
    System.out.println(obj);
}

그런데, 굳이 Iterator를 사용하는 이유는 무엇일까?

 

가장 앞선 설명에서, 모든 Collection 인터페이스의 구현 클래스는 Iterator 를 갖는다고 했다.

Iterator를 사용해 동일한 동작을 할 수 있다는 뜻이다.

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

        Iterator iterator = list.iterator();

        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }

        for (int i = 0; i < list.size(); i++) {
            Object obj = list.get(i);	// HashSet 에는 get(int i) 메서드가 없다.
            System.out.println(obj);
        }
    }
}

반면, for 문을 사용하게 될 경우,

필요에 의해 Collection 의 구현 클래스를 바꿨을 때 (위의 예제에서는 ArrayList -> HashSet)

제대로 동작하지 않는 문제가 발생한다. (구현체의 메서드에 종속 돼 버림)

 

따라서, Collection 의 구현체를 변경할 수 있는 상황이라면, 반복적으로 요소들을 읽어올 때에는 for문 보다 Iterator 사용이 바람직하다.

 

public class IteratorEx {
    public static void main(String[] args) {
        //ArrayList list = new ArrayList();
        Collection collection1 = new HashSet();
        // Collection collection1 = new HashMap();
        
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");

        Iterator iterator = list.iterator();
		
        //어떤 컬렉션으로 구현체를 바꿔도 동일하게 동작한다. (다형성)
        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }
    }
}

 

참조자료

https://www.youtube.com/watch?v=k5qxJ53RYNc

 

'JAVA' 카테고리의 다른 글

컬렉션_HashSet(1)  (0) 2024.02.19
컬렉션_Iterator 과 Map  (0) 2024.02.17
컬렉션_스택&큐  (0) 2024.02.15
컬렉션_LinkedList  (0) 2024.02.15
컬렉션_ArrayList  (0) 2024.02.14