전체/Java

fail-fast 방식 개념

effortDev 2017. 9. 20. 17:54


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


자바 콜렉션 프레임워크에 포함되어 있는 List, Vector, HashTable 등은 모두 fail-fast 방식으로 동작하지만

Enumeration 인터페이스만 fail-fast 방식이 아니다.