๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] Iterator. for ๋ฌธ๊ณผ์˜ ๋น„๊ต

์ถœ์ฒ˜

ChatGPT


Iterator๋Š” ์ž๋ฐ”์—์„œ ์ปฌ๋ ‰์…˜(Collection)์˜ ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. for ๋ฌธ๊ณผ ๋น„๊ตํ•ด Iterator๊ฐ€ ์™œ ํ•„์š”ํ•œ๊ณ  ์–ด๋–ค ์ ์—์„œ ์œ ์šฉํ•œ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด์ ๊ณผ Iterator์˜ ํ•„์š”์„ฑ์„ ์‚ดํŽด๋ณธ๋‹ค.

 

1. Iterator์˜ ํ•„์š”์„ฑ

1.1 ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ผ๊ด€๋œ ์ ‘๊ทผ ๋ฐฉ์‹

Iterator๋Š” ์ž๋ฐ”์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ปฌ๋ ‰์…˜(List, Set, Map ๋“ฑ)๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ, ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. Iterator๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์— ์ƒํ™˜์—†์ด ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

1.2 ์•ˆ์ „ํ•œ ์š”์†Œ ์ œ๊ฑฐ

Iterator๋Š” ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. for-each ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๋Š” ๋™์•ˆ์—๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ ์‹œ๋„ํ•œ๋‹ค๋ฉด, ConcurrentModificationException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Iterator์˜ remove() ๋ฉ”์†Œ๋“œ๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

 

  • for ๋ฌธ, for-each ๋ฌธ
๋”๋ณด๊ธฐ

for ๋ฌธ

๊ตฌ์กฐ

for (์ดˆ๊ธฐํ™”; ์กฐ๊ฑด์‹; ์ฆ๊ฐ์‹) {
    // ์‹คํ–‰ํ•  ์ฝ”๋“œ
}

 

for-each ๋ฌธ

๊ตฌ์กฐ

for (๋ฐ์ดํ„ฐํƒ€์ž… ๋ณ€์ˆ˜๋ช… : ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜) {
    // ์‹คํ–‰ํ•  ์ฝ”๋“œ
}

 

์˜ˆ์ œ

List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
    String fruit = iterator.next();
    if (fruit.equals("Banana")) {
        iterator.remove();  // ์•ˆ์ „ํ•˜๊ฒŒ ์š”์†Œ๋ฅผ ์ œ๊ฑฐ
    }
}

System.out.println(list);  // [Apple, Cherry]

 

์œ„ ์˜ˆ์ œ์—์„œ Iterator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Banana๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. for-each๋ฌธ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ์š”์†Œ ์ œ๊ฑฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

1.3 ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์œผ๋กœ ๋‹คํ˜•์„ฑ ์ง€์›

Iterator ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ˆœํšŒ ๋ฐฉ์‹๊ณผ ๋ฉ”์†Œ๋“œ(hasNext(), next(), remove())๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Š” ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ปฌ๋ ‰์…˜ ํƒ€์ž…์„ ๋ชฐ๋ผ๋„ Iterator ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ํƒ€์ž…์„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

1.4 ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด์™€์˜ ํ˜ธํ™˜์„ฑ

์ž๋ฐ”์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ž์ฒด์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. Iterator๋Š” ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ์ƒ๊ด€์—†์ด ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ArrayList์™€ LinkedList๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹์ด ๋‹ค๋ฅธ๋‹ค. ArrayList๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ˜๋ฉด, LinkedLists๋Š” ๋…ธ๋“œ์™€ ๋งํฌ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด๋ถ€ ๊ตฌํ˜„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , Iterator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‘ ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. for ๋ฌธ๊ณผ Iterator์˜ ์ฐจ์ด์ 

2.1 for-each ๋ฌธ๊ณผ ์š”์†Œ ์ œ๊ฑฐ ๋ฌธ์ œ

for-each ๋ฌธ์€ Java 5์—์„œ ๋„์ž…๋œ ํŽธ๋ฆฌํ•œ ๋ฌธ๋ฒ•์œผ๋กœ, ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๋Š” ๋™์•ˆ ์ธ๋ฑ์Šค๋‚˜ ๋ฐ˜๋ณต์ž๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ for-each๋ฌธ์€ ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. for-each ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๋Š” ๋™์•ˆ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ConcurrentModificationException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” for-each๋ฌธ์ด ๋‚ด๋ถ€์ ์œผ๋กœ Iterator๋ฅผ ์‚ฌ์šฉํ•ด ์ˆœํšŒํ•˜๋ฉด์„œ ์ปฌ๋ ‰์…˜์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2.2 ์ €์žฅ ๊ตฌ์กฐ์™€ ๋…๋ฆฝ์ ์ธ ์ ‘๊ทผ

Iterator๋Š” ์ปฌ๋ ‰์…˜์˜ ๋‚ด๋ถ€ ์ €์žฅ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ ํ•„์š” ์—†์ด, ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. for๋ฌธ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐฐ์—ด์ด๋‚˜ List๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Set๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ํƒ€์ž…์€ ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ Iterator๋Š” ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ธ๋‹ค.

2.3 ๋Š๊ธ‹ํ•œ ํ‰๊ฐ€

Iterator๋Š” ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ํ‰๊ฐ€ํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Š๊ธ‹ํ•œ ํ‰๊ฐ€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ์ด๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋‚˜ ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

3. Iteraator์™€ for๋ฌธ ์‚ฌ์šฉ์˜ ์žฅ๋‹จ์  ์š”์•ฝ

ํŠน์ง• Iterator for๋ฌธ(ํŠนํžˆ for-each)
์•ˆ์ „ํ•œ ์š”์†Œ ์ œ๊ฑฐ ๊ฐ€๋Šฅ(remove() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ๋ถˆ๊ฐ€๋Šฅ(ConcurrentModificationException ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
๊ตฌ์กฐ ๋…๋ฆฝ์ ์ธ ์ ‘๊ทผ ๊ฐ€๋Šฅ (๋ชจ๋“  ์ปฌ๋ ‰์…˜ ํƒ€์ž…์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹ ์ œ๊ณต) ์ปฌ๋ ‰์…˜ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„(์˜ˆ: ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ถˆ๊ฐ€)
์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ ์ฝ”๋“ฃ๊ฐ€ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ(๋ฐ˜๋ณต์ž ๊ด€๋ฆฌ ํ•„์š”) ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ 
๋‹คํ˜•์„ฑ ์ง€์› ๊ฐ•๋ ฅํ•œ ๋‹คํ˜•์„ฑ ์ œ๊ณต(Iterator ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ) ๋‹คํ˜•์„ฑ ์ง€์› ์ œํ•œ์ 
๋Š๊ธ‹ํ•œ ํ‰๊ฐ€ ์ง€์› ๊ฐ€๋Šฅ(์š”์†Œ๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งŒ ํ‰๊ฐ€) ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ์ˆœํšŒ

 

 

4. ๊ฒฐ๋ก  : Iterator์˜ ์กด์žฌ ์ด์œ 

์ž๋ฐ”์—์„œ Iterator๋ฅผ ๋„์ž…ํ•œ ์ด์œ ๋Š” ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰์…˜์„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•˜๋ฉฐ, ํƒ€์ž… ๋…๋ฆฝ์ ์ธ ์ˆœํšŒ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. for๋ฌธ(ํŠนํžˆ for-each)์€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ํƒ€์ž…์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ์ œํ•œ๊ณผ ์š”์†Œ ์ œ๊ฑฐ์˜ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. Iterator๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๋‹คํ˜•์„ฑ ๋ฐ ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ž๋ฐ”์˜ ์ปฌ๋ ‰์…˜ ์ˆœํšŒ๋ฅผ ์œ„ํ•œ ์ค‘์š”ํ•œ ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.