iterator는 반복자로, iterator를 사용하면 Collection의 요소를 하나씩 열거할 수 있다.
java.util.Iterator를 import해서 사용할 수 있다.
사용법: Collection 객체의 iterator를 가져와서 사용한다.
메소드
Method | Description | Return Value | Throws |
boolean hasNext() | 다음으로 return할 element가 있는지 알려준다. | iteration이 element를 더 가지고 있다면 true를 return | - |
E next() | iteration에 있는 다음 element를 가져온다. | iteration의 다음 element | NoSuchElementExcetion - iteration에 element가 더 없을 때 |
default void remove() | iterator에서 가장 마지막으로 꺼낸 element를 Collection에서 제거한다. | - | IllegalStateException - remove 외의 방법으로 Collection에 변화가 생겼을 때 발생 IllegalStateException - next 메소드가 한 번도 호출되지 않았거나, next의 마지막 호출 후에 remove가 실행되었을 때 |
default void forEachRemaining (Consumer<? super E> action) |
iterator에 남아있는 모든 요소에 대해서 같은 action을 수행한다. | - | NullPointException - 특정 action이 null일 때 |
테스트를 위해 예제를 만들었다.
class Main {
public static void main(String[] args) throws Exception {
// ArrayList
List<Integer> numList = new ArrayList<>();
// list 값 초기화
for(int i = 0 ; i < 10 ; i++) {
numList.add(i);
}
System.out.println("-----remove 전-----");
// Iterator 생성
Iterator it = numList.iterator();
// numList 출력 및 반복하며 짝수는 제거
while(it.hasNext()) {
int num = (int) it.next();
System.out.println("num: "+ num);
if(num %2 == 0) {
it.remove();
}
}
//numList.removeIf(i->i%2==0);
System.out.println("-----remove 후-----");
// forEachRemaining()을 사용해서 출력
it = numList.iterator();
it.forEachRemaining(num -> System.out.println("num: "+ num));
}
}
hasNext, next를 사용해서 numList에 있는 element들을 하나씩 불러서 출력해보았다. 그와 동시에 remove를 사용해서 짝수인 element는 numList에서 제거하였다.
짝수를 제거한 결과는 forEachRemaining을 사용해서 출력하였다.
실행 결과는 다음과 같다.
ArrayList에 대해서만 실습을 수행하였으나, Map이나 Set 등 다른 Collection 객체에 대해서도 iterator를 사용할 수 있다.
Iterator 인터페이스 내부는 위와 같다. hasNext, next는 추상 메소드로, remove와 forEachRemaining 메소드는 default 메소드로 미리 메소드 몸체가 정의되어 있었다.
Collection 클래스가 iteratable 클래스를 상속하고 있다. ArrayList와 같은 여러 Collection 객체는 Collection을 상속하고, next나 hasNext의 구현을 담당한다.
iterator를 그대로 쓰는 것 외에도 ListIterator와 같은, 반복자를 더 편하게 사용할 수 있는 여러 인터페이스도 많다고 한다. 공부할 게 정말 많다는 생각이 든다.
for문과 비교했을 때 iterator의 장점이 뭔지도 궁금해서 찾아봤다. 기존에 있던 Collection 객체를 다른 Collection 객체로 바꿀 때, 유지보수에 유리하다는 말을 찾아볼 수 있었다.
유지보수에 대해서는 아래 글에서 잘 설명되어 있었다.
[Java][정리] Collection Framework - Iterator(반복자) 사용하는 이유
[Java] Ch11. 컬렉션 프레임워크(Collection Framework) * iterator는 반복자라는 의미를 가지고 있다. * 인터페이스로 실제 코드는 아래와 같다. java.util 패키지에 있다. (JDK를 설치한 뒤 C:\Program Files\J..
skkcha.tistory.com
iterator의 존재는 알고 있었지만 손에 잘 붙지 않아서 사용하지 않았는데, 유지보수를 생각하자니 사용하는 버릇을 들이는게 좋겠다는 생각이 들었다.
- 참고
docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
learnjava.co.in/java-8-iterator-foreachremaining/
iterator 사용하는 이유
'java' 카테고리의 다른 글
[210116] java comparable & comparator (0) | 2021.01.16 |
---|---|
[210112] java collection (0) | 2021.01.12 |
[201216] lambda 및 함수적 인터페이스 (0) | 2020.12.16 |
[201211] default method (0) | 2020.12.11 |
[201019] spring AOP pointcut annotation (0) | 2020.10.19 |