본문 바로가기

Java

자바 Iterator, Enumeration 인터페이스

자바 Iterator, Enumeration 인터페이스


Iterator는 반복자라는 뜻으로, Iterator 인터페이스는 자료를 얻어내는데 사용한다. 
이 자료를 얻어내는 iterator() 메소드는 컬렉션(Collection) 자료형이라면 관계없이 사용가능하다.

For문 등으로도 충분히 자료들을 꺼내올 수 있는데, 굳이 Iterator가 필요한 이유는 무엇인가.
혹 ArrayList에 담긴 데이터를 Set으로 옮겼다면 일반적으로는 출력문까지 전면 수정이 필요하지만,
Iterator는 데이터를 빼오는 방식을 표준화하는데 그 목적이 있기 때문에 코드의 재활용이 가능하다.(다형성)



Iterator 인터페이스에서 쓰이는 메소드는 크게 3개다.

hasNext() : 
뒤에 남은 데이터가 있으면 True, 없으면 False를 반환한다. while 루프를 통한 제어처리시 사용한다.

next() : 자료구조의 다음 데이터를 반환하여, 다음 객체의 레퍼런스를 얻는다.

remove() : 현재 조회하는 객체의 레퍼런스를 삭제한다.





Enumeration은 Iterator에서 remove() 메소드만 빠지고, 이름만 다를 뿐 사용법은 같다.

hasMoreElements() : Iterator의 .hasNext()와 같은 기능이다.

nextElement() : Iterator의 next()와 같은 기능이다. 





자주 쓰이는 ArrayList, Hashmap, HashSet에서 Iterator를 사용해보도록 하겠다.


ArrayList에서 Iterator 인터페이스 사용하기

List를 선언한다.
System.out.println("=======ArrayList=======");
ArrayList<String> list = new ArrayList<>();
for(int i = 0; i<3; i++) {
    list.add("AAA "+i);
}

Iterator 객체 it을 선언한다.
while문의 조건으로 .hasNext()를 사용해 다음 값이 존재하는 동안 
반복문을 돌며 .next()를 통해 값을 꺼내온다.
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    System.out.println(it.next());
}

=======ArrayList=======
AAA 0
AAA 1
AAA 2


HashMap에서 Iterator 인터페이스 사용하기

HashMap을 하나 생성한다.

 System.out.println("========HashMap========");
HashMap<Integer, String> map = new HashMap<>();
for(int i = 0; i<3; i++) {
    map.put(i, "AAA"+i);
}


ArrayList를 꺼내는 과정과 같지만, keySet을 꺼내는 것이기 때문에 key와 .get(key)를 사용해 key와 value를 꺼내는 작업이 필요하다. 사실 HashMap에서는 그냥 For문 돌리는게 더 나은 것 같다.

Iterator<Integer> it3 = map.keySet().iterator();
while(it3.hasNext()) {
    int key = it3.next();
    System.out.print("key : "+ key);
    System.out.println(" / value : "+ map.get(key));
}

HashSet에서 Iterator 인터페이스 사용하기

생성. 
System.out.println("========HashSet========");
HashSet<String> set = new HashSet<>();
for(int i = 0; i<3; i++) {
    set.add("ABC "+i);
}

ArrayList와 문법이 완전히 같다.

 Iterator<String> it2 = set.iterator();
while(it2.hasNext()) {
    System.out.println(it2.next());
}






다음은 포스팅에 사용한 코드 전문.


Iterator_.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
public class Iterator_ {
      public static void main(String[] args) {
                        
            //ArrayList에서 iterator 인터페이스 사용하기
            System.out.println("=======ArrayList=======");
            ArrayList<String> list = new ArrayList<>();
            for(int i = 0; i<3; i++) {
                  list.add("AAA "+i);
            }
            Iterator<String> it = list.iterator();
            while(it.hasNext()) {
                  System.out.println(it.next());
            }
            //HashSet에서 iterator 인터페이스 이용하기
            System.out.println("========HashSet========");
            HashSet<String> set = new HashSet<>();
            for(int i = 0; i<3; i++) {
                  set.add("ABC "+i);
            }
            Iterator<String> it2 = set.iterator();
            while(it2.hasNext()) {
                  System.out.println(it2.next());
            }
            
            //HashMap에서 iterator 인터페이스 이용하기
            System.out.println("========HashMap========");
            HashMap<Integer, String> map = new HashMap<>();
            for(int i = 0; i<3; i++) {
                  map.put(i, "AAA"+i);
            }
            Iterator<Integer> it3 = map.keySet().iterator();
            while(it3.hasNext()) {
                  int key = it3.next();
                  System.out.print("key : "+ key);
                  System.out.println(" / value : "+ map.get(key));
            }
            
      } // main
}
=======ArrayList=======
AAA 0
AAA 1
AAA 2
========HashSet========
ABC 0
ABC 1
ABC 2
========HashMap========
key : 0 / value : AAA0
key : 1 / value : AAA1
key : 2 / value : AAA2