<서론>
자바로 개발 중, ConcurrentModificationException이 발생했다. set을 사용할 때 나온 exception인데, 거의 처음 만난 exception이라 당황했다. 대충 찾아보니 동시성 문제라고 한다. set을 iterator에서 불러서 iterator.hasNext()를 while문 조건으로 넣어놓고 set을 수정했더니 이런 문제가 발생했다.
<본론>
set을 하나 복사해서 하면 될거라고 생각했다. 하지만 set이 깊은 복사가 되어서 복사한 set을 수정해도 원본의 set이 수정되었다. 결국 깊은 복사가 아닌 얕은 복사로 해당 문제를 해결하였다.
아래는 이해를 돕기 위한 코드이다.
1) 깊은 복사인 경우. (이때는 ConcurrentModificationException이 발생)
1
2
3
4
5
6
|
Set<Integer> tmpSet = set;
tmpSet.addAll(set);
Iterator<Integer> it = tmpSet.iterator();
while(it.hasNext()) {
set.add(it.next()+num);
}
|
cs |
2) 얕은 복사인 경우.(addAll( )을 이용하여 얕은 복사)
1
2
3
4
5
6
|
Set<Integer> tmpSet = new HashSet<Integer>();
tmpSet.addAll(set);
Iterator<Integer> it = tmpSet.iterator();
while(it.hasNext()) {
set.add(it.next()+num);
}
|
cs |
<결론>
굉장히 간단하고 쉬운 문제지만, 갑자기 Exception을 마주하니 당황하게 되었다. 평소 깊은 복사, 얕은 복사 별 생각없이 개발했었는데, 이런 문제를 겪어보면서 실력있는 개발자가 되기에는 갈 길이 멀다고 느꼈다. 이런 문제들도 미리 생각해서 개발하는 참 개발자가 되어야겠다.(갑자기 분위기 일기)