1. 개념
컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
*Vector , ArrayList , LinkedList와 같은 리스트 자료 구조에서 요소를 순차적으로 검색할 떄는 Iterator인터페이스를 사용하면 편리합니다. List 인터페이스를 구현한 모든 클래스는 Iterator 인터페이스도 구현하고 있으므로, Iterator ()메소드를 호출하면 Iterator 객체를 리턴하고 이 객체를 이용하면 인덱스 없이 순차적 검색이 가능합니다.
*Map인터페이스를 구현한 컬렉션클래스는 키와 값을 같이 저장하고 있기 때문에 iterator()를 직접 호출할수 없고, keySet()이나 entrySet()과 같은 메서드를 통해 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시 iterator()를 호출해야 Iterator를 얻을 수 있습니다.
2. Iterator 인터페이스의 메소드
메소드 설명
boolean hasNext()
다음 반복에서 사용될 요소가 있으면 true리턴
E next()
다음 요소 리턴
void remove()
마지막으로 리턴된 요소를 제거
3. 예제
package c01_iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class MagicianList implements Iterable<String> {
private List<String> list = new ArrayList<String>();
public void add(String name){
list.add(name);
}
public Iterator<String> iterator() {
return new Iterator<String>(){
int seq = 0;
public boolean hasNext() {
return seq < list.size();
}
public String next() {
return list.get(seq++);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] arg){
MagicianList magicians = new MagicianList();
magicians.add("이은결");
magicians.add("Kevin parker");
magicians.add("David Blaine");
Iterator<String> iterator = magicians.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
먼저, main 함수의 황토색 부분을 보면, magicians 의 원소들을 뽑아내는데, magicians 라는 변수를 전혀 쓰지 않습니다. 물론, 내부적으로 iterator라는 변수가 magicians와 관계를 유지해주고 있긴합니다만, 일단 iterator를 가지고 온 후에는 데이터 집합체가 뭐냐에 신경을 쓸 필요가 없어진 것입니다. iterator만 가져오면 hasNext() , next() 만 가지고 반복하면서 원소들에 대해서 처리를 하면 됩니다.
import java.util.*;
public class Iterator {
public static void main ( String [] args ) {
ArrayList a = new ArrayList (); // 빈 리스트 생성
a.add("Hello");
a.add(3); // 자동 박싱, JDK 1.5 이후에서만 실행됨
a.add(3.14); // 자동 박싱
a.add(2, 3.4); // 자동 박싱, 인덱스 2에 객체 삽입
Iterator i = a.iterator (); // Iterator 객체 반환
while( i.hasNext()) { // Iterator 객체에 요소가 있을 때까지 반복
Object obj = i.next(); // 다음 요소 반환
if(obj instanceof String) { // String 객체의 경우
String str = (String)obj;
System.out.println(str);
}
else if(obj instanceof Integer) { // Integer 객체의 경우
int n = (Integer)obj; // 자동 언박싱, JDK 1.5 이후에서만 실행됨
System.out.println(n);
}
else if(obj instanceof Double){ // Double 객체의 경우
double d = (Double)obj; // 자동 언박싱, JDK 1.5 이후에서만 실행됨
System.out.println(d);
}
}
}
}
4. Iterator관련 interface
소스 코드의 보라색 부분이 jdk 안에 있는 Iterator에 관한 부분입니다.
java.util.Iterable 이란 것을 구현하고 있습니다. 이것한테는 Iterator<E> iterator() 라는 메소드 한개만 있습니다. 이 클래스는 무슨무슨 집합체 데이터를 가지고 있으니, iterator로 원소들을 뽑아다가 쓸 수 있도록 제공하겠다는 것 입니다.
그담에 등장하는 것이 java.util.Iterator입니다. 소스 코드의 청록색 부분입니다.
method가 3개가 있죠? hasNext()는 다음 구성 요소가 있냐고 물어봅니다. next()는 그 요소를 뽑아옵니다.
한가지 짚고 넘어가야 할 것은 시퀀스는 hasNext()가 아니라 next()에서 증가시켜야 한다는 것입니다. hasNext라는 메소드 이름이, next를 가지고 있는지를 체크하겠다는 것이기 때문입니다.
5. JAVA API에 있는 Iterator
우리가 알고 있는 일반적인 집합체들은 전부 Iterator를 제공합니다. Set, List 등은 Collection 을 상속 받는데, Collection이 Iteratable을 상속 받기 때문입니다.
위에서 청록색 부분을 list.iterator() 라고 쭐여버려도 됩니다. JDK 안에 들어 있는 것들을 가져다 쓰는데, 거의 대부분 Iterator를 제공하기 때문입니다.(Map은 한 다리 건너서 제공합니다.) 그래서 Iterator를 직접 구현할 일은 거의 없습니다. 가져다가 쓸 일이 있을 뿐입니다.
이제 Map은 왜 Iterator를 제공하지 않는 지를 살펴보죠. Map은 Set이나 List와는 달리 key-value의 구조입니다. key에 대한 Iterator인지 value에 대한 Iterator인지 구별할 방법이 없습니다. 그래서 아예 제공을 안 합니다. 그러나 Map에는 key에 대해서는 Set<K> keySet()이라는 key를 Set으로 가져오기를 지원하고, value에 대해서는 Collection<V> values() 를 제공합니다. 위에서 말씀드렸다시피 Set과 Collection은 둘다 Iterator를 제공합니다.
6. Enumeration vs Iterator vs ListIterator
굉장히 유사합니다. Enumeration의 경우는 boolean hasMoreElements() 와 E nextElement() 를 제공합니다. Iterator의 hasNext() , next() 에 대응되는 메쏘드들입니다.
차이는 두 가집니다. 첫째 Iterator에는 remove()가 있습니다. 둘째, Iterator의 함수 이름이 훨씬 쉽다.(타이핑 노가다가 줄어듬)
처음에 Enumeration이 나왔고, 그걸 쫌 편하게 만들어보자한 것이 Iterator입니다.
ListInterator는 Iteraor의 기능을 향상시킨 것 입니다.
'Java & Html' 카테고리의 다른 글
iOS6 SAFARI BUG (iOS6 사파리 버그 - AJAX, SPINNING, ...) (0) | 2012.12.11 |
---|---|
The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit (0) | 2012.12.10 |
MVC model (0) | 2012.11.06 |
HTML 마크업 (0) | 2012.11.06 |
HTML5와 CSS3의 장점 (0) | 2012.11.06 |