List<String> list = new ArrayList<String>(); list.add("AAAA"); list.add("BBBB"); list.add("CCCC"); list.add("DDDD"); list.add("EEEE"); list.add("FFFF"); list.add("GGGG"); for(String value : list) { if(value.startsWith("D")) { list.remove(value); } } System.out.println("Result: " + list);
위와 같은 소스코드가 있다고 가정을 해보겠습니다. 위의 코드는 단순히 리스트 전체를 순환중에 값이 D로 시작하는 경우 그 객체(현재 순환중인 자기자신)를 삭제하고자 하는 의도를 가지고 있는 코드입니다.
하지만 위의 코드는 다음과 같은 오류를 만나게 됩니다.
Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at RemoveInLoop.main(RemoveInLoop.java:20)
기본적으로 리스트는 순환중에 리스트의 추가, 삭제, 변경등 자기 자신을 수정할 수 없게 되어있습니다. 하지만 다음과 같이 Iterator를 활용하면 가능합니다.
List<String> list = new ArrayList<String>(); list.add("AAAA"); list.add("BBBB"); list.add("CCCC"); list.add("DDDD"); list.add("EEEE"); list.add("FFFF"); list.add("GGGG"); for(Iterator<String> it = list.iterator() ; it.hasNext() ; ) { String value = it.next(); if(value.startsWith("C")) { it.remove(); } } System.out.println("Result: " + list);
이번에는 C로 시작하는 값을 지워보려는 목적으로 가지고 실행을 해보았습니다. 오류 없이 다음과 같은 결과를 보여줍니다.
Result: [AAAA, BBBB, DDDD, EEEE, FFFF, GGGG]