자바 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