[펌글] Java Fail-Fast Iterator

By | 2월 28, 2012

- 출처 : 
http://entireboy.egloos.com/4024389 -

Fail-fast는 어떠한 시스템이나 모듈에 잘못됐거나 문제가 생길 것 같을 때 바로 알려주는 특성을 나타낸다. 이는 언제 잘못될지 모르는 상태를 가지고 시스템을 계속 동작시키는 것 보다 평범하게 멈추는 것이 낫다는 생각에 기반한 것이다. 소프트웨어 공학에서 Iterator와 함께 사용된다. Fail Fast Iterator라고 하여 Iterator가 도는(?) 동안 Iterator가 변경되거나 하면 오류를 발생하도록 하는 것이다. (from Wikipedia)

Java의 Iterator도 유사한 점이 있다. Iterator가 도는 동안 원래 목록이 변경되면 java.util.ConcurrentModificationException을 발생시킨다. 아래의 코드를 보자. 반지의 제왕 1편에서 보로미르가 죽었다. TㅅT 그래서 반지 원정대(fellowship; 이름이 너무 길어서 짤라묵었다. -ㅅ-)에서 제거하려 한다. 무심코 아래와 같이 제거(remove)하려 한다면 ConcurrentModificationException을 보게 될 것이다.

List fellowship = new ArrayList ();

fellowship.add(new Person(21, "간달프")); // 이 예제에서 숫자는 별 의미 없다.
fellowship.add(new Person(22, "프로도"));
fellowship.add(new Person(23, "아라곤"));
fellowship.add(new Person(24, "김리"));
fellowship.add(new Person(25, "보로미르"));
fellowship.add(new Person(26, "레골라스"));
fellowship.add(new Person(27, "스미골"));

Person person = null;
Iterator personIterator = fellowship.iterator();
while(personIterator.hasNext())
{
    person = personIterator.next();
    if("보로미르".equals(person.getName()))
        fellowship.remove(person);
}


아래와 같이 Iterator를 사용하는 enhanced for문도 마찬가지로 똑같은 예외를 볼 수 있다. (Iterable 인터페이스를 상속 받아 사용할 수 있다.)

for(Person person: fellowship)
{
    if("보로미르".equals(person.getName()))
        fellowship.remove(person);
}



+ 무심코 enhanced for문에서 저런 식으로 지우려 했더니 안되드만.. 처음엔 원인을 몰랐는데 우연히 fail-fast를 보고 알았다. -ㅅ-;; 컴파일 시에는 오류가 없으니 조심해야겠다. 

Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
찰스찰스찰스
찰스찰스찰스
12 years ago

이히히히히….ㅋㅋㅋㅋ

호러블캣
호러블캣
12 years ago

=.= 헉 깜짝 놀랬잖아!!!!