Vienna

Chapter 11) 컬렉션 프레임워크 - Iterator 본문

언어/Java의 정석

Chapter 11) 컬렉션 프레임워크 - Iterator

아는개발자 2023. 5. 4. 16:12

Iterator 의 next() 함수를 직접 사용해보았다.
3개의 데이터를 넣고 hasNext() 함수의 return 값이 fasle가 나올 때까지 출력하는 예제를 따라해보았다.

 


그런데 문득 궁금증이 일었다.
만약 이 상태에서 데이터를 3개를 더 넣으면 어떻게 될까?

 

ConcurrentModificationException  오류가 난 것을 확인할 수 있다.

 

이렇게 되면 2가지 가능성을 예측할 수 있다.

 

1. Iterator 객체 내부적으로 다음 index의 값을 출력하기 위해 index를 next() 함수 호출할 때마다 1씩 증가 처리를 한다.

2. Iterator 객체가 생성될 때 Collection 객체의 주소값이 아니라 모든 값을 복사하여 처리한다. 그래서 후에 Collection에 element를 add하여도 Iterator 객체에서 참조하는 Collection의 값은 변함이 없다.

 

그래서 모두 출력한 다음 총 6개의 데이터를 더 넣어보았다.
하지만 여전히 별다른 출력 없이 오류가 나는 것을 보아, 2번의 가능성이 높아보인다.

 

이번엔 ConcurrentModificationException 에러를 검색해보았다.그 결과, 수정이 불가능한 상황에서 object에 수정이 일어날 때 나타나는 오류라고 한다.다른 스레드에서 iterating 중일 때 Collection을 수정할 때 수정하면 나타나는 오류라고 적혀 있다.

 

구글 검색을 해보니 컬렉션 순회 중 데이터의 조작이 발생하는 경우에도 발생할 수 있는 것을 알 수 있었다.

 

이번엔 Iterator를 새로 받아와 처리해보았다.
문제 없이 동작하는 것을 발견할 수 있다.
(위 링크의 블로그의 내용에 따르면, 멀티 쓰레드 환경에서는 성능상 이슈가 발생한다고 한다.)

 

 

여기서 눈여겨 보아야할 부분은 새로 it 객체를 갱신시키기 이전에 Collection 데이터를 수정했을 때에는 에러가 발생하지 않았다는 점이다.
실제로 반복문에서 해당 Iterator 의 next 함수를 호출했을 때 발생한다는 것을 알 수 있다.

그렇다면 next함수에서 Collection의 데이터의 상태를 비교하는 함수가 있지는 않을까?

 

Iterator.next() 함수 정의
checkForComodification() 함수 정의

 

Java API에 있는 modCount에 대한 설명.


즉, ArrayList.Iterator() 함수를 통해 생성된 Iteraotor는 자신이 생성될 때의 modCount 를 저장하고,

next 등의 함수가 호출될 때 ArrayList의 modCount를 확인하여 둘이 상이한 경우 ConcurrentModificationException Exception 오류를 throw 하는 것을 알 수 있다.

Comments