๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

Iterator ํŒจํ„ด์ด๋ž€?

์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„
์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์ˆœํšŒ(iterate)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

 

์™œ Iterator ํŒจํ„ด์ด ํ•„์š”ํ• ๊นŒ? ๊ทธ๋ƒฅ for๋ฌธ ์“ฐ๋ฉด ์•ˆ๋˜๋‚˜??

๋ฌผ๋ก  ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค:

  • ๋ฐฐ์—ด, ๋ฆฌ์ŠคํŠธ, ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๋“ฑ ๊ตฌ์กฐ๋งˆ๋‹ค for๋ฌธ ๋‹ค๋ฅด๊ฒŒ ์งœ์•ผ ๋จ
  • ์—ฌ๋Ÿฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ˆœํšŒํ•˜๋ ค๋ฉด ์ฝ”๋“œ ์ค‘๋ณต์ด ์ƒ๊น€
  • ๋‚˜์ค‘์— ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด for๋ฌธ๋„ ๊ณ ์ณ์•ผ ํ•จ

โžก ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ ๋ถ€์กฑ

 

Iterator ํŒจํ„ด์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด

"์š”์†Œ ๊บผ๋‚ด๋Š” ๋ฐฉ์‹์„ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌ"
→ ์‚ฌ์šฉ์ž๋Š” next()์™€ hasNext()๋งŒ ์•Œ๋ฉด ๋!

Iterator it = bookShelf.iterator();
while (it.hasNext()) {
    Book b = (Book) it.next();
    System.out.println(b.getName());
}

 

  • ๋‚ด๋ถ€๊ฐ€ ๋ฐฐ์—ด์ด๋“  ๋ฆฌ์ŠคํŠธ๋“  ํŠธ๋ฆฌ๋“  ๊ด€๊ณ„์—†์Œ
  • ๋‹จ์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆœํšŒ ๊ฐ€๋Šฅ

๊ตฌ์กฐ ๊ตฌ์„ฑ

์—ญํ•  ํด๋ž˜์Šค๋ช… ์„ค๋ช…
Aggregate BookShelf ์ฑ…์žฅ ์ „์ฒด. ์š”์†Œ ๋ณด๊ด€
Iterator BookShelfIterator ์š”์†Œ ์ˆœํšŒํ•˜๋Š” ์—ญํ• 
Client Main ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ
Element Book ์ˆœํšŒํ•  ๋Œ€์ƒ ๊ฐ์ฒด

 

 

<<๊ธฐ๋ณธ ์˜ˆ์ œ>>

public interface Iterator {
    boolean hasNext();
    Object next();
}

---

public class BookShelf implements Aggregate {
    private List<Book> books = new ArrayList<>();

    public void add(Book book) {
        books.add(book);
    }

    public Book get(int index) {
        return books.get(index);
    }

    public int size() {
        return books.size();
    }

    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

---

public class BookShelfIterator implements Iterator {
    private BookShelf shelf;
    private int index = 0;

    public BookShelfIterator(BookShelf shelf) {
        this.shelf = shelf;
    }

    public boolean hasNext() {
        return index < shelf.size();
    }

    public Object next() {
        return shelf.get(index++);
    }
}

 

ํ™•์žฅ ์˜ˆ์‹œ : ์žก์ง€์žฅ ์ถ”๊ฐ€

public class MagazineShelf implements Aggregate {
    private LinkedList<Magazine> magazines = new LinkedList<>();

    public void add(Magazine m) {
        magazines.add(m);
    }

    public Magazine get(int index) {
        return magazines.get(index);
    }

    public int size() {
        return magazines.size();
    }

    public Iterator iterator() {
        return new MagazineShelfIterator(this);
    }
}

 

์ด์ œ ๋‘ ์ž๋ฃŒ๊ตฌ์กฐ ๋ชจ๋‘ ๊ฐ™์€๋ฐฉ์‹์œผ๋กœ ์ˆœํšŒ ๊ฐ€๋Šฅ!

printItems(bookShelf.iterator());
printItems(magazineShelf.iterator());

 

instanceof? Object? ์™œ ์“ฐ๋Š”์ง€ ํ—ท๊ฐˆ๋ ธ๋‹ค๋ฉด?

Iterator๊ฐ€ Object๋ฅผ ๋ฆฌํ„ดํ•˜๋‹ˆ๊นŒ ์‹ค์ œ ๊ฐ์ฒด(Book, Magazine)๋ฅผ ๊บผ๋‚ด๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ์จ์•ผ ํ•œ๋‹ค.

Object item = it.next();
if (item instanceof Book) {
    System.out.println(((Book) item).getName());
}

→ ํ•˜์ง€๋งŒ Book, Magazine ๋ชจ๋‘ getTitle()์ด๋ผ๋Š” ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ PrintableItem ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ํ›จ์”ฌ ๊น”๋”ํ•ด์ง„๋‹ค.

 

 

Iterator ํŒจํ„ด ์žฅ์  ์š”์•ฝ

- ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ˆœํšŒ ๊ฐ€๋Šฅ
- ๋‚ด๋ถ€ ๊ตฌ์กฐ ์ˆจ๊น€ → ์บก์Аํ™”
- ์ˆœํšŒ ๋ฐฉ์‹(์ •๋ฐฉํ–ฅ, ์—ญ๋ฐฉํ–ฅ ๋“ฑ)๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
- ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ ๋งค์šฐ ์ข‹์Œ

 

์‹ค๋ฌด์—์„œ ์–ด๋””์„œ ์“ฐ์ด๋ƒ?

 

  • ์ž๋ฐ” ์ปฌ๋ ‰์…˜ (List, Set, Map) → .iterator() ์žˆ์Œ
  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€ AOP, ResultSet ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์— ํ™œ์šฉ
  • ์™ธ๋ถ€ API, DB, ํŒŒ์ผ ๋“ฑ ๋ฐ˜๋ณต ์ˆœํšŒ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉ

 

๋ฐ˜์‘ํ˜•