Java Iterator, ListIterator, Enumration, Map과 Iterator
by 볼빵빵오춘기Iterator, ListIterator, Enumeration
- 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
* Iterator 인터페이스의 메서드
- boolean hasNext()
읽어 올 요소가 남아있는지 확인한다. (있으면 true, 없으면 false를 반환한다.) - Object next()
다음 요소를 읽어온다. (next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.) - void remove()
next()로 읽어 온 요소를 삭제한다.(next()를 호출한 다음에 remove()를 호출해야 한다.(선택적 기능)) - void forEachRemaining(Consumer<? super E> action)
컬렉션에 남아있는 요소들에 대해 지정된 작업(action)을 수행한다. (람다식을 사용하는 디폴트 메서드이다.(JDK1.8부터 추가))
⇒ 핵심은 hasNext(), next() 밑에 remove(), forEachRemaining(Consumer<? super E> action) 일단 신경 끄기
* Enumeration 인터페이스의 메서드
- boolean hasMoreElements()
읽어 올 요소가 남아있는지 확인한다.(있으면 true, 없으면 false를 반환한다. & Iterator의 hasNext()와 같다.) - Object nextElement()
다음 요소를 읽어 온다. nextElement()를 호출하기 전에 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안전하다. (Iterator의 next()와 같다.)
⇒ Iterator을 쓰면되는데 Enumeration 을 쓰는곳이 남아있음. 하지만 메소드는 기능은 같기 떄문에 알아두기
- ListIterator는 Iterator의 접근성을 향상시킨 것이다.(단방향[다음요소만 읽어옴] → 양방향[다음요소, 이전요소를 읽어올 수있다.])
- 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것이다.(= List, Set, Map 마다 구조가 다 다르기 때문에 읽어오는 방법을 표준화 한 것이다.)
- 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용한다.
⇒ List, Set은 Collection의 자손이기때문에 바로 읽어 올 수 있다.
예제 코드
예제 코드1
import java.util.*;
public class VarEx3 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
// 위에 반복문을 한번 더 돌린다고 하더라도 변수가 있어야만 있어야 나옴
// 따라서 여기는 실행 돌릴것이 없음
// Iterator은 1회용.
// 다시 출력할려면
// it = list.iterator(); => 주석해제
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
예제 코드2
import java.util.*;
public class VarEx3 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
for(int i=0;i<list.size();i++) {
Object obj = list.get(i);
System.out.println(obj);
}
}
}
for문으로 변경하면 예제 코드1의 주석해제와 같은 결과가 나온다.
예제 코드3
예제코드2 에서 list변수를 ArrayList로 만드는게 아니라 HashSet으로 변경하면
import java.util.*;
public class VarEx3 {
public static void main(String[] args) {
HashSet list = new HashSet(); // Set은 Collection의 자손
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
// 동작하지않음
for(int i=0;i<list.size();i++) {
Object obj = list.get(i);
System.out.println(obj);
}
}
}
HashSet에는 get이라는 메소드가 없으므로 for문은 동작하지않는다.
그런데 iterator사용한 코드는 잘 동작한다.
CollectionFramework을 쓰다보면 성능이나 여러가지 문제로 HashSet을 ArrayList로 바꾼다거나 이런 코드 변경이 있는데 위에 같은 문제가 일어나면 동작하지않기때문에 Iterator로 가져오면 표준화되어있기 때문에 다른 코드는 변경하지않아도 된다.
예제 코드4
import java.util.*;
public class VarEx3 {
public static void main(String[] args) {
Collection list = new HashSet(); // Set은 Collection의 자손
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
참조변수의 타입을 Collection으로 해줌으로써 아래코드의 영향을 주지않게 할 수도 있다.
Map과 Iterator
Map에는 iterator()가 없다.
따라서 Map에 있는 요소를 가져올려면 keySet(), entrySet(), values()를 호출해야한다.
※ 참고
keySet(),entrySet() ⇒ 반환타입은 Set
values() ⇒ 반환타입 Collection
'👩🏻💻 About 프로그래밍 > Java' 카테고리의 다른 글
Java Comparator와 Comparable (0) | 2023.12.07 |
---|---|
Java Arrays, 배열의 출력·복사·채우기·정렬·검색 등 (0) | 2023.12.07 |
Java 스택과 큐(Stack & Queue), 스택& 큐 활용 (0) | 2023.12.07 |
Java LinkedList, LinkedList vs ArrayList (0) | 2023.12.07 |
Java ArrayList (0) | 2023.12.07 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기