fail-fast 방식 개념
Iterator를 학습하는 도중
Enumeration과 Iterator를 비교하는 글을 보게 되어 정리하게 되었다.
1. Enumeration이란?
Enumeration은 객체들의 집합(Vector)에서 각각의 객체들을 한순간에 하나씩 처리할 수 있는 메소드를 제공하는 컬렉션이다.
Enumeration 객체는 new 연산자로 생성할 수 없으며, Vector를 이용하여 생성할 수 있다.
Vector 클래스의 elements() 라는 메소드는 객체의 모든 요소들을 Enumeration 객체로 반환한다.
Enumeration 메소드 | 설명 |
boolean hasMoreElements() |
Vector로 부터 생성된 Enumeration의 요소가 있으면 true, 아니면 false 반환 |
Object nextElement() |
Enumeration 내의 다음 요소를 반환한다. |
2. Iterator란?
Iterator는 Enumeration 클래스와 매우 유사하며 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 방법이다.
Iterator 메소드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 확인하는 메소드이다. 있으면 true, 없으면 false를 반환한다. |
Object next() | Iterator 내의 다음 요소를 반환한다. |
3. Enumeration과 Iterator 의 차이점
Enumeration과 Iterator 의 가장 큰 차이점은 fail-fast 방식 개념이다.
콜렉션 클래스들은 저장된 객체들에 대한 순차적 접근을 제공한다.
Enumeration은 순차적 접근 시 콜렉션 객체에 변경이 일어나도 이를 무시하고, 끝까지 동작한다.
Iterator는 순차적 접근이 모두 끝나기 전에 콜렉션 객체에 변경이 일어날 경우 순차적 접근이 실패되면서 예외를 return하게 되는데 이를 fail-fast 방식이라고 부른다.
다음은 Junit을 이용해 fail-fast 동작에 대한 테스트 코드이다.
3.1 Iterator Junit 테스트
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; public class FailFastTest { private List<Integer> myList; @Before public void init() { myList = new ArrayList<Integer>(); for (int i = 0; i < 1000; i++) { myList.add(i); } } @Test public void iteratorTest() throws InterruptedException { new MyThread().start(); Iterator<Integer> it = myList.iterator(); while (it.hasNext()) { Thread.sleep(10); System.out.println(it.next()); } } class MyThread extends Thread { @Override public void run() { System.out.println("MyThread Start :"); try { Thread.sleep(1000); // 1초 동안 sleep } catch (InterruptedException e) { e.printStackTrace(); } myList.remove(1); // iterator collection 객체 변경 System.out.println(myList); // iterator로 받아 반복을 돌린 객체는 객체가 변경되면 멈춘다. // 출력값 : 1이 remove된 순간 객체 변경을 알고 반복을 멈춤 0~99, {0,2,3 ... 999} 출력됨. } } } | cs |
3.2 Enumeration Junit 테스트
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.junit.Before; import org.junit.Test; public class FailFastTest { private Vector<Integer> vecList; @Before public void init() { vecList = new Vector<Integer>(); for (int i = 0; i < 1000; i++) { vecList.add(i); } } @Test public void enumerationTest() throws InterruptedException { new MyThread().start(); Enumeration<Integer> en = vecList.elements(); while (en.hasMoreElements()) { Thread.sleep(10); System.out.println(en.nextElement()); } } class MyThread extends Thread { @Override public void run() { System.out.println("MyThread Start :"); try { Thread.sleep(1000); // 1초 동안 sleep } catch (InterruptedException e) { e.printStackTrace(); } vecList.remove(1); // Enumeration collection 객체 변경 System.out.println(vecList); // Enumeration으로 받아 반복을 돌린 객체는 객체가 변경되어도 멈추지않는다. // 출력값 : 0 ~ 999 출력이 되고 반복문으로 숫자가 찍히는 중간에 {0,2,3 ... 999} 출력됨. } } } | cs |