티스토리 뷰

Iterator 란?

  • Java의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 한 것
  • Collection Framework 란?
    • 데이터를 저장하는 클래스들을 표준화 한 설계
    • Collections Framework 에는 Set, List, Map 등이 포함
    • Set, List 는 Collection 인터페이스를 상속받고 Map 은 그렇지 않음
    • Collection Interface
        • SubInterface
        • 대표적으로 Set과 List 등이있으며 이들을 구현한 클래스는 아래와 같음
          • HashSet, TreeSet, ArrayList, LinkedList, Vector 등
  • Iterator Interface method

  • Iterator 사용법
    • Set이나 List같은 경우에는 인터페이스에 iterator() 메소드가 있으므로 그대로 쓰면된다.
    • Map 은 iterator() 메소드가 없으므로 entrySet() 을 통해서 사용할 수 있다(링크참고)

List 인터페이스의 iterator()
Set 인터페이스의 iterator()

Iterator vs Iterable

  • Iterable 이란?
    • 해당 인터페이스를 구현하면 객체를 통해 "for-each-loop"를 사용할 수 있다라고 설명하고 있다.
    • Java 8 버전부터 추가되었음
    • Method

Iteravle Interface api 에서 forEach 메소드가 있는 것을 볼 수 있다.

  • Iterable forEach 메소드
public class IterableTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Map<String, Integer> m = new HashMap<String, Integer>();
		m.put("one", 1);
		m.put("two", 2);
		m.put("three", 3);
		Set<String> str = m.keySet();
		
		iterableTest(m);
	}
	
	static void iterableTest(Map map) {
		Set<Map.Entry<String, Integer>> entries = map.entrySet();
		Iterable<Map.Entry<String, Integer>> itr = entries;
		itr.forEach(System.out::println);
	}

}

결과

  • iterator 와 iterable 의 특징
    • Iterator
      • iterator instance 는 iteration state 를 저장할 수 있다.
        • next() 메소드를 통해 현재 element의 상태를 확인할 수 있다.
        • 이러한 특징을 통해 각각의 element를 처리할 수 있다.
      • remove() 등의 메소드가 있어 element를 삭제할 수 있다.
      • ListIterator 를 subinterface로 하기 때문에 앞뒤로 데이터 이동이 가능하다.
    • Iterable
      • iteration 상태를 알 수 없다.
      • element 를 삭제할 수 없다.
      • 앞뒤로 데이터 이동이 불가능하다.
      • 위에서 설명한 iterator 에서 사용할 수 있는 기능을 사용하고자 하면 Iterator 인스턴스를 생성하고 iterator() 메소드를 통해 접근해야 한다.

For-each vs Iterator 

  • 생각해보면 난 ArrayList를 사용하면서 Iterator 를 통해 구현한 적이 없다. for-each나 for문을 통해 데이터를 가져오는게 익숙하기 때문이다.
  • 찾아본 바로는 for-each는 collection을 수정할 수 없고 Iterator는 collection 수정이 가능하니 데이터를 단순히 가져오는 용도라면 for-each를 사용하라고 한다.
    • 왜냐면 더 가독성이 좋기때문에
  • Iterator는 지우기 가능/for-each는 지우기 불가능
for (String i : list) {
    System.out.println(i);
    list.remove(i); // throws exception
} 

Iterator it=list.iterator();
while (it.hasNext()){
    System.out.println(it.next());
    it.remove(); // valid here
}

 

  • 가독성 비교
for (String s : stringList) { ... }

for (Iterator<String> iter = stringList.iterator(); iter.hasNext(); ) {
  String s = iter.next();
  ...
}

 

 

References

Java api
https://docs.oracle.com/javase/8/docs/api/

java 컬렉션 프레임워크 정리
https://pridiot.tistory.com/63

Iterator와 Iterable 비교
https://www.techiedelight.com/differences-between-iterator-and-iterable-in-java/

For-each와 Iterator 비교
https://stackoverflow.com/questions/18508786/for-each-vs-iterator-which-will-be-the-better-option

https://www.geeksforgeeks.org/iterator-vs-foreach-in-java/

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함