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, ํ์ผ ๋ฑ ๋ฐ๋ณต ์ํ ์ฒ๋ฆฌํ ๋ ์ ์ฉ