본문 바로가기
프로그래밍/자바

루프 도중 안전하게 삭제하기

by pentode 2018. 4. 17.

데이터를 ArrayList에 담아서 작업 도중 유효성 검사 등을 통해서 조건에 맞지 않는것을 삭제하려고 합니다. 루프(loop)를 돌면서 유효성을 체크해서 삭제를 하는데, 일반적인 for 루프를 사용하면 예외가 발생하거나 원하는 결과를 얻지 못할 수 있습니다.


삭제를 해버리면 내부적으로 루핑을 돌기 위해 사용하는 list의 크기와 처리해야할 항목을 가리키는 인덱스의 불일치 때문에 에러 또는 논리적인 오류가 발생합니다.

 

List list = new ArrayList();
list.add("apple");
list.add("banana");
list.add("melon");

for(String str : list) {
    if("melon".equals(str)) {
        list.remove(str);
    }
}

System.out.println(list);

결과)
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
	at java.util.ArrayList$Itr.next(ArrayList.java:831)

 

이것을 해결하는 방법으로는 index 를 사용하는 for 루프를 사용해서 없어진 많큼 사이즈와 인덱스를 직접 조정할 수 있습니다.

 

int size = list.size();
for(int i = 0; i < size; i++) {
    String str = list.get(i);
    if("melon".equals(str)) {
        list.remove(str);
        size--;
        i--;
    }
}

 

이것보다 우아한 방법은 Iterator를 사용하는 것입니다.

 

List list = new ArrayList();
list.add("apple");
list.add("banana");
list.add("melon");

Iterator iter = list.iterator();
while(iter.hasNext()) {
    if("melon".equals(iter.next())) {
        iter.remove();
    }
}

System.out.println(list);

결과)
[apple, banana]

 

루프 도중에 아이템을 오류없이 삭제하는 방법에 대해서 알아 보았습니다.

반응형