| English | 의미 |
|---|---|
| ConcurrentModificationException/kənˈkʌrənt ˌmɒdɪfɪˈkeɪʃn ekˈsepʃn/ | ConcurrentModificationException |
의도된 변경 사항에 맞는 순회(traversal) 방식 선택
- ArrayList에는 [2, 3, 4]이 포함되어 있습니다. 저장된 모든 값을 두 배로 하되 요소의 개수는 그대로 유지하고 싶습니다.
- 인덱스 루프(list.set(i, 2 * list.get(i)))를 사용할 수 있습니다. for (int x : list)에서 x = 2*x를 할당하면 로컬 루프 변수만 변경될 뿐입니다.
목록 [2, 3, 4]에서 for (int x : list) { x = 2 * x; }를 실행합니다. list.get(1)은 무엇입니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
로컬 원시형 x에 할당하는 것은 저장된 Integer를 교체하지 않습니다. 중간 목록 요소는 여전히 3입니다.
목록 순환하기
- ArrayList을 배열처럼, 단 해당 메소드를 사용하여 순회하십시오. 인덱스:
for (int i = 0; i < list.size(); i++) { ... list.get(i) ... } - For-each:
for (String s : list) { ... s ... }— 값 읽기에 적합합니다.size()(length가 아님)이 인덱스 루프의 범위를 정의합니다.
동일한 패턴
- 합계, 카운트, 최소/최대, 검색은 배열과 동일하게 작동합니다. 단순히
a[i]을list.get(i)으로,a.length을list.size()으로 교체하면 됩니다. - accumulator(누적변수)와 max/count 로직은 동일합니다. 배열 순회에 대해 배운 내용은 모두 그대로 적용됩니다.
읽기 vs 수정
- 강화된 루프(eenhanced loop)는 각 요소의 값을 루프 변수에 복사합니다. ⟨
Integer⟩ 요소를 ⟨int x⟩로 읽었을 때, ⟨x⟩에 할당하는 것은 목록 요소를 교체하지 않습니다. 인덱스 루프에서는 ⟨set(i, x)⟩로 교체할 수 있습니다. - 구조적 변경(추가/삭제)의 경우 인덱스 루프를 주의 깊게 사용하십시오. 읽기는 간단하지만, 루프 중 삭제는 추가적인 주의가 필요합니다(다음 수업).
인덱스로 ArrayList 합계 구하기
size()로 바운드 설정, get(i)으로 읽기 (list = [10,20,30]).
인덱스 기반 for 루프의 올바른 조건은 ...입니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
ArrayList은 size(); 배열은 length를 사용합니다.
Why should a program avoid direct structural changes during an ArrayList enhanced-for traversal?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
ArrayList fail-fast behaviour is best-effort. Avoid unsafe traversal rather than relying on a guaranteed exception.
배열 순회 패턴(합계, 카운트, 최대값)은 ArrayList에도 동일하게 적용됩니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
a[i]/a.length를 list.get(i)/list.size()로 교체하면 됩니다.
리스트를 순회하면서 안전하게 요소를 제거하려면 ...을 사용해야 합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
for-each는 구조적 수정을 할 수 없습니다; 인덱스 기반 루프는(조심스럽게) 가능합니다.
트러버설 중 구조적 수정이 없으면 enhanced loop가 ArrayList
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
루프는 저장된 각 참조를 읽습니다. 트러버설 중 구조적 변경은 별개의 문제이며, 이 주장은 가능한 모든 요소에 대한 모든 연산이 안전함을 보장하지 않습니다.
for-each 중 수정 금지
- for-each 루프 중 추가 또는 삭제는 ConcurrentModificationException을 유발할 수 있으며; fail-fast 감지는 최선의 노력에 기반합니다. for-each 루프는 내부 구조가 변하지 않는다고 가정합니다.
- 순회 중 삭제를 위해 인덱스 루프(및 인덱스 관리)를 사용하십시오. 순회 중 구조적 변경이 없다면 for-each로 읽기를 사용하는 것이 적합합니다. 또한 요소 요구사항도 확인하십시오: null Integer의 언박싱(unboxing)은 여전히 예외를 발생시킵니다.
_bound an indexed ArrayList loop with list.size(), not .length, and never structurally modify during a for-each. Calling add/remove inside a for (x : list) may trigger a ConcurrentModificationException, but detection is not guaranteed. To delete while traversing, use an indexed loop — and remember remove(i) shifts later elements, so don't blindly i++ past the shifted element.
After the indexed doubling update, what is list.get(1)?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
The middle stored value 3 is replaced by 6. Reassigning a primitive loop variable would leave it at 3.
non-null Student 항목에 대해 for (Student s : students) 내부의 s.addScore(5)는 목록 요소를 추가하거나 제거하지 않고도 저장된 학생 데이터를 변경할 수 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
복사된 참조는 가변 Student 객체에 도달합니다. Defaults의 필드는 목록 구조를 변경하지 않고도 변경될 수 있습니다.
ArrayList
- 인덱스:
for (int i = 0; i < list.size(); i++) { sum += list.get(i); } - For-each:
for (int x : list) { sum += x; }(autoboxing/unboxing이 Integer↔int을 처리함). - 두 방법 모두 list를 총합으로 계산합니다; for-each는 read-only일 때 더 깔끔합니다.
추론을 새로운 사례로 확장하기
- 강화된 순회 중 직접 추가하거나 삭제하는 것은 안전하지 않으며; fail-fast 예외는 최선의 노력에 기반하며, 정확성을 보장하는 검증 도구가 아닙니다.
- 비null 요소를 가정할 때, 가변적 Student 객체의 리스트를
for (Student s : students) { s.addScore(5); }로 순환할 수 있습니다. 이는 각 객체의 상태를 변경할 뿐 리스트 구조 자체는 바꾸지 않습니다;s에 다른 참조를 할당하면 저장된 요소를 교체하지 못합니다.
ArrayList를 인덱스 기반 루프(i < list.size(), list.get(i)) 또는 각 요소를 값으로 받는 향상된(eenhanced) 루프로 순환하십시오. 합계, 개수, 최소/최대, 검색 등의 배열 패턴은 모두 동일하게 적용됩니다. 향상된 순환 중에는 직접적인 구조적 변경을 피하십시오: ConcurrentModificationException이 버그를 감지할 수는 있지만, 그것이 보장되지는 않습니다. 다음에 가르칠 제거 패턴을 위해 신중하게 관리된 인덱스 기반 루프를 사용하십시오. 참조된 객체의 필드를 변경하는 것은 리스트 구조를 변경하는 것과 다릅니다.