/ JAVAJUNGSUK

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