System.out.println(restaurant.getMenuRestaurants().size());
for(MenuRestaurant menures:restaurant.getMenuRestaurants()){
ms.delete(menures);
}
이렇게 돌려놨더니
System.out.println(restaurant.getMenuRestaurants().size());
얘의 결과는 2인데 For문은 한 번돌고 빠져나오더라. 뭐가 문제일까 했는데 리스트를 돌다가 그 안의 원소를 삭제해버리니깐 발생하는 문제였다.
그래서 Iterator를 사용해서 해결하려 했다.
for (Iterator<MenuRestaurant> iterator = restaurant.getMenuRestaurants().iterator(); iterator.hasNext();) {
MenuRestaurant menures = iterator.next();
ms.delete(menures);
iterator.remove(); // This removes the element from the collection safely
}
이랬더니 ConcurrentModificationException이 발생하더라.
list.remove(index)는 그 인덱스의 element를 삭제하고 index+1부터 나머지 element들을 한 칸씩 댕겨온다. remove메서드는 어떤 카운터 변수를 하나 증가시킨다.
향상된 for문은 while(list.iterator.hasNext()) 방식으로 리스트를 순회하는데 hasNext() 에서는 remove에서 증가시킨 카운터와 다른 카운터가 일치하는지를 보고, 일치하지 않으면 concurrentModificationException을 발생시킨다.
참고: https://m.blog.naver.com/tmondev/220393974518
그래서
List<MenuRestaurant> toRemove = new ArrayList<>();
for (MenuRestaurant menures : restaurant.getMenuRestaurants()) {
toRemove.add(menures);
}
for (MenuRestaurant menures : toRemove) {
ms.delete(menures);
restaurant.getMenuRestaurants().remove(menures);
}
새로운 리스트를 만들어서 이를 해결해주었다.