Java/JAVA 100 문제 풀이

자바 part.5 문제풀이 - 컬렉션 프레임워크에서 ConcurrentModificationException 피하는 방법: Iterator 활용하기

진이최고다 2023. 8. 2. 01:07

Iterator의 필요성

컬렉션 프레임워크를 사용할 때, 컬렉션의 요소를 반복문 안에서 삭제하면서 순회하려고 하면 종종 "java.util.ConcurrentModificationException"이라는 오류 메시지를 만나게된다. 이 오류는 컬렉션의 구조가 반복 중에 변경되었음을 나타내며, 이로 인해 반복자가 더이상 유효하지 않게 되어 발생한다.

 

Iterator를 사용하여 이런 문제를 피할 수 있다. Iterator는 컬렉션을 안전하게 순회할 수 있는 방법을 제공하며, "remove()" 메서드를 통해 현재 요소를 안전하게 제거할 수 있다. 따라서 컬렉션을 순회하면서 요소를 삭제해야 하는 경우에는 Iterator를 사용하는 것이 좋다.

 

예제
import java.util.ArrayList;
import java.util.Iterator;

public class Collection_FrameworkIterator02 {
	
    public static void main(String[] args) {
    	
    	//[1] : 객체생성
    	ArrayList<Integer> list = new ArrayList<>();
    	
    	//[2] : 요소 추가 -> add()
    	list.add(1);
    	list.add(2);
    	list.add(3);
    	list.add(4);
    	
    	//[3] : Iterator(반복자) 객체 생성
    	Iterator<Integer> iter = list.iterator();
    	
    	//[4] : 출력
    	for(Integer num : list) {
    		System.out.println(num + "");
    	}System.out.println();
    	
    	//[5 - 1] : 요소 삭제 -> 반복문 없이 한 개의 요소만 삭제
//    	System.out.println(list.get(1)); //2 출력
//    	list.remove(1);					 //2 삭제
//    	System.out.println(list.get(1)); //3 출력
    	
    	//[5 - 2] : 요소 삭제 -> while 반복문 사용
    	System.out.println("--- while 반복문 삭제 ---");
    	while(iter.hasNext()) {
    		Integer i = iter.next();
    		if(i == 2) {
    			iter.remove();
    			System.out.println(i + "번 삭제");
    		}
    	}
    }
}

Iterator와 "while" 반복문을 사용하여 list의 모든 요소를 순회하고, 값이 2인 요소를 삭제한다. 이 경우, "remove()" 메서드는 안전하게 현재 요소를 삭제하므로 "ConcurrentModificationException" 오류가 발생하지 않는다.

 

예제 [5 - 2] 코드처럼 컬렉션을 안전하게 순회하면서 요소를 삭제할 수 있고, 이는 컬렉션 프레임워크를 사용할 때 자주 발생하는 문제를 해결하는 방법이다.