Java/Java 문법

[JAVA] 자바 iterator 반복자 / iterator 와 ListIterator

민돌v 2021. 4. 19. 20:42

1. iterator(반복자)

- iterator란 쉽게말해 자바에서 제공해주는 인터페이스 입니다.

- 자바 컬렉션 인터페이스 (쉽게 List, Set 등등으로 이해) 에서는 iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 합니다.

2. iterator 인터페이스 메소드

메소드 설명
boolean hasNext() 해당 이터레이션(iteration)이 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next() 이터레이션(iteration)의 다음 요소를 반환함.
default void remove() 해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거함. (선택적 기능)

iterator 사용법 예제

LinkedList<Integer> lnkList = new LinkedList<Integer>(); lnkList.add(4); lnkList.add(2); lnkList.add(3); lnkList.add(1); Iterator<Integer> iter = lnkList.iterator(); while (iter.hasNext()) { System.out.print(iter.next() + " "); }

LinkedList<Integer> lnkList = new LinkedList<Integer>(); 
lnkList.add(4); 
lnkList.add(2); 
lnkList.add(3); 
lnkList.add(1); 
Iterator<Integer> iter = lnkList.iterator();
while (iter.hasNext()) { 
	System.out.print(iter.next() + " "); 
    }

실행 결과

4 2 3 1

(iterator 쓰는 이유, 장점?)

  • iterator 반복자를 사용하면 list의 인덱스의 접근이 쉬워지는 것 같습니다. (제 생각입니다.)
  • iterator 와 Listiterator의 차이점은 list는 한방향으로 인덱스를 순휘하지만, Listiterator는 양뱡형 순회가 가능합니다.

(iterator 주의사항)

  • 현재 자바에서는 될 수 있으면 Enhanced for문을 사용하도록 권장합니다.
  • Enhanced for문을 사용하면 같은성능을 유지하며, 코드의 면확성을 확보할 수 있으며 버그를 예방해 준다고 합니다...

- 하지만 요소의 선택적 제거나 대체 등을 수행하기 위한 경우에는 반복자(itreator)를 사용해야 합니다.

3. ListIterator<E> 인터페이스

- Listiterator란 iterator 인터페에스를 상속받아 여러 기능을 추가한 인터페이스 입니다.

- iterator와의 차이점은 Listiterator 인터페이스는 컬렉션 요소의 대체, 추가 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원합니다.

단, ListIterator 인터페이스는 List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator() 메소드를 통해 사용할 수 있습니다. (LinkedList)

4. ListIterator 인터페이스 메소드

메소드 설명
void add(E e) 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)
boolean hasNext() 이 리스트 반복자가 해당 리스트를 순방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
boolean hasPrevious() 이 리스트 반복자가 해당 리스트를 역방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next() 리스트의 다음 요소를 반환하고, 커서(cursor)의 위치를 순방향으로 이동시킴.
int nextIndex() 다음 next() 메소드를 호출하면 반환될 요소의 인덱스를 반환함.
E previous() 리스트의 이전 요소를 반환하고, 커서(cursor)의 위치를 역방향으로 이동시킴.
int previousIndex() 다음 previous() 메소드를 호출하면 반환될 요소의 인덱스를 반환함.
void remove() next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 리스트에서 제거함. (선택적 기능)
void set(E e) next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 전달된 객체로 대체함. (선택적 기능)

ListIterator 사용법 예제

 

LinkedList<Integer> lnkList = new LinkedList<Integer>(); 
lnkList.add(4); 
lnkList.add(2); 
lnkList.add(3); 
lnkList.add(1); 
ListIterator<Integer> iter = lnkList.listIterator();
while (iter.hasNext()) { 
	System.out.print(iter.next() + " "); 
    }
    
while (iter.hasPrevious()) { 
	System.out.print(iter.previous() + " "); 
    }

실행 결과

4 2 3 1

1 3 2 4