JAVA에서는 컬렉션 객체들의 각 항목들을 순차 조회하기 위해 Enumeration 과 Iterator 인터페이스를 제공한다.
그렇다면 둘의 차이점은 무엇일까?
Enumeration
- Enumeration은 JAVA의 초창기에 만들어진 인터페이스로 지금은 거의 사용하지 않는 HashTable이나 Vector에서 사용가능하다.
- SnapShot을 제공하여 해당 컬렉션 객체 순차조회가 다 끝나기전에 항목에 수정이 있어도 문제없이 수행.
* 스냅샷(SnapShot) 이란?
- 객체 순차 조회를 하기 전의 상태를 사진처럼 찍어놓고, 변경사항을 반영하지 않는 것.
- Enumeration에서는 컬렉션의 Enumeration 객체를 얻어 올 때 객체 복사를 이용해 새로운 객체를 저장합니다.
<Vector의 elements() 메소드> : return new Enumberation<>();
<HashTable의 elements()메소드>
elements()는 getEnumeration()메소드를 다시 호출하고
getEnumeration() 메소드에서는 return new Enumerator<>를 하는 것을 볼 수 있음.
Iterator
- JAVA2 부터 도입된 인터페이스로 컬렉션 인터페이스를 구현한 모든 클래스에서 사용 가능
- SnapShot을 제공하지 않아, iterator가 모든 항목을 순차 조회하기 전 컬렉션 객체에 변경사항(삽입/삭제/수정)이 일어나면 ConcurrentModificationException 예외가 발생 -> 실패
- 위와 같은 기능을 fail-fast라고 부른다.
- 결함이 없는 결과/상태를 나타나기 위해 빠르게 실패 예외를 내뿜는 것을 이해하면 편함.
-만약,변경사항에 영향을 받지 않으면서 즉시멈춤(fail-fast)기능도 사용하고 싶지 않다면 우리가 직접 SnapShot을 만들어 사용하자.
- how?
해당 컬렉션을 복사하여 새로운 컬렉션을 만들고 그것의 iterator()을 얻어 사용하자.
* Map 의 경우는 반복자가 ConcurrentModificationException을 발생시키지 않으려면 ConcurrentHashMap을 사용한다.
Non-Thread-Safe한 HashMap의 동시성을 위해서도 ConcurrentHashMap을 사용하니 추후에 더 알아보도록 하자