Iterator
Iterator는 컬렉션 프레임워크에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준환 한 것이다.
▼ Iterator인터페이스에 정의된 메소드들
| 메소드 | 설명 |
|---|---|
| boolean hasNext() | 참조할 다음 번째 요소Element가 존재하면 true를 반환한다. |
| E next() | 다음 번 요소를 반환한다. |
| void remove() | 현재 위치의 요소를 삭제한다. |
import java.util.Iterator;
import java.util.LinkedList;
public class IteratorTest {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("First");
list.add("Second");
list.add("Third");
list.add("Fourth");
// iterator 메소드가 생성하는 인스턴스를 '반복자'라고 한다.
Iterator<String> itr = list.iterator();
System.out.println("반복자를 이용한 1차 출력과 \"Third\" 삭제");
while(itr.hasNext()) {
String curStr = itr.next();
System.out.println(curStr);
if(curStr.compareTo("Third")==0) {
itr.remove();
}
}
System.out.println("\n\"Third\" 삭제 후 반복자를 이용한 2차 출력");
itr = list.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
}
}
Iterator의 장점
컬렉션 클래스 기본자료형 저장
ArrayList arr = new ArrayList(); //error
LinkedList linl = new LinkedList(); //error
기본 자료형 정보를 이용해서 제네릭 인스턴스는 생성 불가능하다. 그러므로 Wraper 클래스를 기반으로 컬렉션 인스턴스를 생성해야 한다.
import java.util.Iterator;
import java.util.LinkedList;
public class IteratorTest {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(10); // Auto Boxing
list.add(20); // Auto Boxing
list.add(30); // Auto Boxing
Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
int num = itr.next(); // Auto Boxing
System.out.println(num);
}
}
}
Auto Boxing과 Auto Unboxing의 도움으로 정수 단위의 데이터 입출력이 매우 자연스럽다.
HashSet
HashSet은 Set인터페이스를 구현하는 대표적인 컬렉션으로 Set의 특징과 같이 중복된 요소를 저장하지 않는다. HashSet은 ArrayList와 달리 저장순서를 유지 하지 않는다.
import java.util.HashSet;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
HashSet<String> hSet = new HashSet<String>();
hSet.add("First");
hSet.add("Second");
hSet.add("Third");
hSet.add("First");
System.out.println("저장된 데이터 수 : " + hSet.size());
Iterator<String> itr = hSet.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
}
}
동일한 문자열의 인스턴스는 저장되지 않았다.
TreeSet
TreeSet은 이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션이다. TreeSet은 Set인터페이스를 구현하여 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장되므로 저장순서를 유지하지 않아도 된다.
import java.util.Iterator;
import java.util.TreeSet;
public class IteratorTest {
public static void main(String[] args) {
TreeSet<integer> sTree = new TreeSet<integer>();
sTree.add(1);
sTree.add(2);
sTree.add(4);
sTree.add(3);
sTree.add(2);
System.out.println("저장된 데이터 수 : " + sTree.size());
Iterator<integer> itr = sTree.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
}
}
데이터는 정렬되어 저장이 되며, iterator메소드의 호출로 생성된 반복자는 오름차순의 데이터 참조를 진행한다.
HashMap
HashMap은 Map을 구현하여 키Key와 값Value을 묶어서 하나의 데이터로 저장한다. HashMap은 해싱Hashing을 사용하여 많은 양의 데이터를 검색하는데 높은 성능을 보여준다.
import java.util.HashMap;
public class IteratorTest {
public static void main(String[] args) {
HashMap<Integer, String> hMap = new HashMap<Integer, String>();
hMap.put(new Integer(3), "정동현");
hMap.put(5, "안상현");
hMap.put(8, "양동구");
System.out.println("6학년 3반 8번 학생 : " + hMap.get(new Integer(8)));
System.out.println("6학년 3반 5번 학생 : " + hMap.get(5));
System.out.println("6학년 3반 3번 학생 : " + hMap.get(3));
hMap.remove(5); // 5번 데이터 제거
System.out.println("6학년 3반 5번 학생 : " + hMap.get(5));
}
}