Ch11-22~24. Iterator
0. 목차
Chapter11. 컬렉션 프레임웍
Ch11 - 22. Iterator, ListIterator, Enumeration
Ch11 - 23. Iterator, ListIterator, Enumeration 예제
Ch11 - 24. Map과 Iterator
Ch11 - 22. Iterator, ListIterator, Enumeration
▶ Iterator, ListIterator, Enumeration란?
▷ 컬렉션에 저장 된 데이터를 접근(읽어오기)하는 데 사용되는 인터페이스
▷ Iteratornew ≒ Enumerationold
▷ ListIterator는 Iterator 접근성을 향상시킨 것
- Iterator : next(→) 다음 요소
- ListIterator : next(→) 다음 요소 + previous(←) 이전 요소
▶ Iterator 인터페이스의 메서드
▷ boolean hasNext()
- 읽어 올 요소가 남아있는지 확인
- 있으면 true, 없으면 false
▷ Object next()
- 읽기
- next()를 호출하기 전 hasNext()를 호출 →
읽을 거리 여부 확인 →
안전↑
▶ Iterator 인터페이스의 메서드가 필요한 이유?
▷ 컬렉션마다 읽어오는 방법이 다 다름
- ArrayList, LinkedList, TreeSet, Map…
- 이러한 컬렉션들은 읽기 방법이 다 다름
▷ Iterator은 컬렉션에 저장 된 요소들을 읽어오는 방법을 표준화 시킴
- 컬렉션이 달라도 읽으려면 Iterator만 사용할 줄 알면 됨
▶ Iterator() 사용 방법
▷ 컬렉션에 Iterator()를 호출하여 Iterator를 구현한 객체를 얻어 사용
List list = new ArrayList(); // 다른 컬렉션으로 변경 시, 이 부분만 고치면 됨
Iterator it = list.iterator(); // Iterator 객체 반환
while (it.hasNext()) { // 읽을 거리 여부 확인, 없으면 false
System.out.println(it.next()); // 읽을 거리 읽어 오기
}
▶ Enumeration 인터페이스의 메서드
▷ boolean hasMoreElements()
- 읽어 올 요소가 남아있는지 확인
- 있으면 true, 없으면 false
▷ Object nextElement()
- 읽기
- nextElement()를 호출하기 전 hasMoreElements()를 호출 →
읽을 거리 여부 확인 →
안전↑
Ch11 - 23. Iterator, ListIterator, Enumeration 예제
▶ ArrayList에 1, 2, 3, 4, 5 담기
▷ ArrayList 객체 생성
▷ add()
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
▶ Iterator의 메서드로 list 읽기
▷ Iterator에 list 담기
▷ hasNext(), next()
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
// console
1
2
3
4
5
▶ 한 번 더 obj 읽기
▷ while문을 한 번 더 돌리면 두 번 읽어줄까?
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
// console
1
2
3
4
5
while문을 한 번 더 돌리면 두 번 읽어줄까? X
Iterator는 일회용
한 번 더 Iterator를 생성 해 주어야 두 번 읽어 줌
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
it = list.iterator(); // 한 번 더 iterator 생성
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
// console
1
2
3
4
5 // 첫 번째
1
2
3
4
5 // 두 번째
▶ for문으로 list 읽기
▷ Iterator 대신 for문으로 list 읽기 : Iterator 생성 또 안 해도 됨
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
System.out.println(object);
}
// console
1
2
3
4
5 // 첫 번째 : Iterator
1
2
3
4
5 // 두 번째 : for문
▶ ArrayList → HashSet 변경 시, for문으로 list 읽기가능?
▷ 불가능
▷ HashSet에는 get이 없음
public class PlayIterator {
public static void main(String[] args) {
HashSet list = new HashSet(); // ArrayList → HashSet 변경
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i); // get ERROR!, HashSet에는 get()이 없어서
System.out.println(object);
}
}
}
▶ HashSet list = new HashSet();
에서 list → hash 변경
▷ list
우클릭 → Refactor → Rename → hash 입력
HashSet hash = new HashSet(); // 아래의 list도 hash로 변경 됨
hash.add("1");
hash.add("2");
hash.add("3");
hash.add("4");
hash.add("5");
▶ Collection list = new HashSet();
▷ [Set : HashSet…] [List] [] [] … ⊂ Collection
▷ 그래서 객체 생성 시, Collection list = new HashSet();
이런 식이 좋음
▷ 코드 변경 감소
Collection list = new HashSet();
Collection list = new TreeSet();
Collection list = new ArrayList();
Ch11 - 24. Map과 Iterator
▶ Map에는?
▷ Iterator가 없음
- Iterator code
public interface Collection { // [Collection] -자손→ [List] [Set : keySet(), entrySet()...] ... public Iterator iterator(); }
▷ Map에서 Iterator를 사용하려면, keySet(), entrySet(), values()를 호출
Map map = new HashMap();
...
Iterator it = map.entrySet().iterator(); // entry : key-value
// 두 줄로 풀어쓰면
Set eSet = map.entrySet();
Iterator it = eSet.iterator();
// 더 쉽게 풀어쓰면
◐ = eSet
◑ = iterator
● = eSet.iterator
● = it