๋””์ž์ธ ํŒจํ„ด/GOF

๐Ÿ’  ๋ฐ˜๋ณต์ž(Iterator) ํŒจํ„ด - ์™„๋ฒฝ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

์ธํŒŒ_ 2023. 3. 13. 09:43

Iterator-pattern
Iterator-pattern

Iterator Pattern

๋ฐ˜๋ณต์ž(Iterator) ํŒจํ„ด์€ ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์— ๋Œ€ํ•˜์—ฌ ์ˆœ์ฐจ์ ์ธ ์ ‘๊ทผ(์ˆœํšŒ)์„ ์ง€์›ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ด๋ž€ ๊ฐ์ฒด๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ์ž๋ฃŒ์˜ ๊ตฌ์กฐ๋ฅผ ์ทจํ•˜๋Š” ์ปฌ๋ ‰์…˜์„ ๋งํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์ปฌ๋ ‰์…˜์œผ๋กœ ํ•œ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณธ ๋ฆฌ์ŠคํŠธ๋‚˜ ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„, ํ…Œ์ด๋ธ” ..๋“ฑ์ด ์žˆ๋‹ค.

Iterator-pattern
์š”์†Œ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜

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

์˜ˆ๋ฅผ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋–ค ์ƒํ™ฉ์—์„  ๊นŠ์ด(์„ธ๋กœ)๋ฅผ ์šฐ์„ ์œผ๋กœ ์ˆœํšŒ ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋„ˆ๋น„(๊ฐ€๋กœ)๋ฅผ ์šฐ์„ ์œผ๋กœ ์ˆœํšŒํ• ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Iterator-pattern
์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ˆœํšŒํ• ์ง€ ์ปฌ๋ ‰์…˜๋งˆ๋‹ค ๋‹ค๋ฅผ์ˆ˜ ์žˆ๋‹ค

์ด์ฒ˜๋Ÿผ ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€์žˆ๋Š” ์ž๋ฃŒ ์ปฌ๋ ‰์…˜๋“ค์„ ์ˆœํšŒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „๋žต์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ปฌ๋ ‰์…˜ ๊ฐ์ฒด ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋“ค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ณตํ†ตํ™” ๋˜์–ด ์žˆ๋‹ค๋ฉด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ปฌ๋ ‰์…˜์—์„œ๋„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ๋ฝ‘์•„๋‚ด๋ฉด ์—ฌ๋Ÿฌ ์ „๋žต์œผ๋กœ ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด ๋ณด๋‹ค ๋‹คํ˜•(ๅคšๅฝข) ์ ์ธ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Iterator-pattern

์ž๋ฐ”์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ(JCF)์—์„œ ๊ฐ์ข… ์ปฌ๋ ‰์…˜์„ ๋ฌด๋ฆฌ์—†์ด ์ˆœํšŒํ• ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ๋‚ด๋ถ€์— ๋ฏธ๋ฆฌ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด์ด ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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


์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด ๊ตฌ์กฐ

Iterator-pattern

  • Aggregate (์ธํ„ฐํŽ˜์ด์Šค) : ConcreateIterator ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • iterator() : ConcreateIterator ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ
  • ConcreateAggregate (ํด๋ž˜์Šค) : ์—ฌ๋Ÿฌ ์š”์†Œ๋“ค์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ฒด
  • Iterator (์ธํ„ฐํŽ˜์ด์Šค) : ์ง‘ํ•ฉ์ฒด ๋‚ด์˜ ์š”์†Œ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • hasNext() : ์ˆœํšŒํ•  ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ (true / false)
    • next() : ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ค€๋น„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚ด
  • ConcreateIterator (ํด๋ž˜์Šค) : ๋ฐ˜๋ณต์ž ๊ฐ์ฒด
    • ConcreateAggregate๊ฐ€ ๊ตฌํ˜„ํ•œ ๋ฉ”์„œ๋“œ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๋ฉฐ, ConcreateAggregate ์˜ ์ปฌ๋ ‰์…˜์„ ์ฐธ์กฐํ•˜์—ฌ ์ˆœํšŒํ•œ๋‹ค.
    • ์–ด๋–ค ์ „๋žต์œผ๋กœ ์ˆœํšŒํ• ์ง€์— ๋Œ€ํ•œ ๋กœ์ง์„ ๊ตฌ์ฒดํ™” ํ•œ๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด ํ๋ฆ„

 

ํด๋ž˜์Šค ๊ตฌ์„ฑ

// ์ง‘ํ•ฉ์ฒด ๊ฐ์ฒด (์ปฌ๋ ‰์…˜)
interface Aggregate {
    Iterator iterator();
}

class ConcreteAggregate implements Aggregate {
    Object[] arr; // ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ (์ปฌ๋ ‰์…˜)
    int index = 0;

    public ConcreteAggregate(int size) {
        this.arr = new Object[size];
    }

    public void add(Object o) {
        if(index < arr.length) {
            arr[index] = o;
            index++;
        }
    }

    // ๋‚ด๋ถ€ ์ปฌ๋ ‰์…˜์„ ์ธ์ž๋กœ ๋„ฃ์–ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(arr);
    }
}
// ๋ฐ˜๋ณต์ฒด ๊ฐ์ฒด
interface Iterator {
    boolean hasNext();
    Object next();
}

class ConcreteIterator implements Iterator {
    Object[] arr;
    private int nextIndex = 0; // ์ปค์„œ (for๋ฌธ์˜ i ๋ณ€์ˆ˜ ์—ญํ• )

    // ์ƒ์„ฑ์ž๋กœ ์ˆœํšŒํ•  ์ปฌ๋ ‰์…˜์„ ๋ฐ›์•„ ํ•„๋“œ์— ์ฐธ์กฐ ์‹œํ‚ด
    public ConcreteIterator(Object[] arr) {
        this.arr = arr;
    }

    // ์ˆœํšŒํ•  ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ true / false
    @Override
    public boolean hasNext() {
        return nextIndex < arr.length;
    }

    // ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ปค์„œ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ํ•œ๋‹ค.
    @Override
    public Object next() {
        return arr[nextIndex++];
    }
}

 

ํด๋ž˜์Šค ํ๋ฆ„

public static void main(String[] args) {
    // 1. ์ง‘ํ•ฉ์ฒด ์ƒ์„ฑ
    ConcreteAggregate aggregate = new ConcreteAggregate(5);
    aggregate.add(1);
    aggregate.add(2);
    aggregate.add(3);
    aggregate.add(4);
    aggregate.add(5);

    // 2. ์ง‘ํ•ฉ์ฒด์—์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜
    Iterator iter = aggregate.iterator();

    // 3. ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋‚ด๋ถ€ ์ปค์„œ๋ฅผ ํ†ตํ•ด ์ˆœํšŒ
    while(iter.hasNext()) {
        System.out.printf("%s → ", iter.next());
    }
}

Iterator-pattern

์œ„์˜ ์˜ˆ์ œ์—์„  ๊ตฌํ˜„์„ ๊ฐ„๋‹จํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ง‘ํ•ฉ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ปฌ๋ ‰์…˜์„ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ–ˆ์ง€๋งŒ, ๋ฐฐ์—ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ์ปฌ๋ ‰์…˜์œผ๋กœ๋„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด ํŠน์ง•

 

ํŒจํ„ด ์‚ฌ์šฉ ์‹œ๊ธฐ

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

 

ํŒจํ„ด ์žฅ์ 

  • ์ผ๊ด€๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ปฌ๋ ‰์…˜์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ฐ ์ˆœํšŒ ๋ฐฉ์‹์„ ์•Œ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์ง‘ํ•ฉ์ฒด์˜ ๊ตฌํ˜„๊ณผ ์ ‘๊ทผํ•˜๋Š” ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์„ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„ ์ผ ์ˆ˜ ์žˆ๋‹ค.
    • Client์—์„œ iterator๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ConcreteAggregate ๋‚ด์— ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ƒ๊ฒจ๋„ iterator์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ„๋„์˜ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด์— ์ถ”์ถœํ•˜์—ฌ ๊ฐ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ €์žฅ ์ปฌ๋ ‰์…˜ ์ข…๋ฅ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์†์ƒ๋˜์ง€ ์•Š์•„ ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™(OCP)๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค.

 

ํŒจํ„ด ๋‹จ์ 

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

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋Š” Iterator ํŒจํ„ด

 

์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ์ˆœํšŒ ์ „๋žต์„ ๋‚˜๋ˆ„๊ธฐ

ํด๋ผ์ด์–ธํŠธ ์š”๊ตฌ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๊ฒŒ์‹œํŒ์— ๊ธ€์„ ์˜ฌ๋ฆด๊ฑด๋ฐ, ๊ฒŒ์‹œ๊ธ€์„ ์ตœ๊ทผ๊ธ€, ์ž‘์„ฑ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ ๋‚˜์—ด ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‹ฌ๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, ๋‘๊ฐ€์ง€ ์ •๋ ฌ ์ „๋žต์„ ๊ตฌํ˜„ํ•ด์•ผ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ํด๋ฆฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ์˜ ์ฝ”๋“œ โŒ

๋‹ค์Œ์€ ๊ฒŒ์‹œ๊ธ€(Post)๊ณผ ๊ฒŒ์‹œํŒ(Borad)๋ฅผ ํ‘œํ˜„ํ•œ ์ธ์Šคํ„ด์Šค์ด๋‹ค.

๊ฒŒ์‹œ๊ธ€์—๋Š” ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ title๊ณผ ๊ฒŒ์‹œ๊ธ€ ๋ฐœํ–‰ ๋‚ ์งœ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค. (์ฝ”๋“œ ๊ฐ„๋žตํ™”๋ฅผ ์œ„ํ•ด ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ์€ ์ƒ๋žตํ•˜์˜€๋‹ค)

// ๊ฒŒ์‹œ๊ธ€
class Post {
    String title; // ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ
    LocalDate date; // ๊ฒŒ์‹œ๊ธ€ ๋ฐœํ–‰์ผ

    public Post(String title, LocalDate date) {
        this.title = title;
        this.date = date;
    }
}

// ๊ฒŒ์‹œํŒ
class Board {
    // ๊ฒŒ์‹œ๊ธ€์„ ๋ฆฌ์ŠคํŠธ ์ง‘ํ•ฉ ๊ฐ์ฒด๋กœ ์ €์žฅ ๊ด€๋ฆฌ
    List<Post> posts = new ArrayList<>();

    public void addPost(String title, LocalDate date) {
        this.posts.add(new Post(title, date));
    }

    public List<Post> getPosts() {
        return posts;
    }
}
public static void main(String[] args) {
    // 1. ๊ฒŒ์‹œํŒ ์ƒ์„ฑ
    Board board = new Board();

    // 2. ๊ฒŒ์‹œํŒ์— ๊ฒŒ์‹œ๊ธ€์„ ํฌ์ŠคํŒ…
    board.addPost("๋””์ž์ธ ํŒจํ„ด ๊ฐ•์˜ ๋ฆฌ๋ทฐ", LocalDate.of(2020, 8, 30));
    board.addPost("๊ฒŒ์ž„ ํ•˜์‹ค๋ถ„", LocalDate.of(2020, 2, 6));
    board.addPost("์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?", LocalDate.of(2020, 6, 1));
    board.addPost("์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?", LocalDate.of(2021, 12, 22));

    List<Post> posts = board.getPosts();
    
    // 3. ๊ฒŒ์‹œ๊ธ€ ๋ฐœํ–‰ ์ˆœ์„œ๋Œ€๋กœ ์กฐํšŒํ•˜๊ธฐ
    for (int i = 0; i < posts.size(); i++) {
        Post post = posts.get(i);
        System.out.println(post.title + " / " + post.date);
    }

    // 4. ๊ฒŒ์‹œ๊ธ€ ๋‚ ์งœ๋ณ„๋กœ ์กฐํšŒํ•˜๊ธฐ
    Collections.sort(posts, (p1, p2) -> p1.date.compareTo(p2.date)); // ์ง‘ํ•ฉ์ฒด๋ฅผ ๋‚ ์งœ๋ณ„๋กœ ์ •๋ ฌ
    for (int i = 0; i < posts.size(); i++) {
        Post post = posts.get(i);
        System.out.println(post.title + " / " + post.date);
    }
}

Iterator-pattern

์ผ๋ฐ˜์ ์œผ๋กœ for๋ฌธ์„ ๋Œ๋ ค ์ง‘ํ•ฉ์ฒด์˜ ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ๋ฐฉ์‹์€ Board์— ๋“ค์–ด๊ฐ„ Post๋ฅผ ์ˆœํšŒํ•  ๋•Œ, Board๊ฐ€ ์–ด๋– ํ•œ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ณด๋‹ค ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด์ž.

 

์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•œ ์ฝ”๋“œ โœ”๏ธ

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

์ˆœํšŒ ์ „๋žต์œผ๋กœ๋Š” ๋ฆฌ์ŠคํŠธ ์ €์žฅ ์ˆœ์„œ๋Œ€๋กœ ์กฐํšŒ์™€ ๋‚ ์งœ ์ˆœ์„œ๋Œ€๋กœ ์กฐํšŒ ๋‘๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์— ๋Œ€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํด๋ž˜์Šค ์—ญ์‹œ ๋‘๊ฐ€์ง€ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  • ListPostIterator : ์ €์žฅ ์ˆœ์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ
  • DatePostIterator : ๋‚ ์งœ ์ˆœ์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ

๊ทธ๋ฆฌ๊ณ  ListPostIterator ์™€ DatePostIterator ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ Board ํด๋ž˜์Šค์— ์ถ”๊ฐ€๋งŒ ํ•ด์ฃผ๋ฉด ์™„์„ฑ ๋œ๋‹ค.

Iterator-pattern

// ์ €์žฅ ์ˆœ์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ
class ListPostIterator implements Iterator<Post> {
    private Iterator<Post> itr;

    public ListPostIterator(List<Post> posts) {
        this.itr = posts.iterator();
    }

    @Override
    public boolean hasNext() {
        return this.itr.hasNext(); // ์ž๋ฐ” ๋‚ด๋ถ€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ์œ„์ž„ํ•ด ๋ฒ„๋ฆผ
    }

    @Override
    public Post next() {
        return this.itr.next(); // ์ž๋ฐ” ๋‚ด๋ถ€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ์œ„์ž„ํ•ด ๋ฒ„๋ฆผ
    }
}

// ๋‚ ์งœ ์ˆœ์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ
class DatePostIterator implements Iterator<Post> {
    private Iterator<Post> itr;

    public DatePostIterator(List<Post> posts) {
        // ์ตœ์‹  ๊ธ€ ๋ชฉ๋ก์ด ๋จผ์ € ์˜ค๋„๋ก ์ •๋ ฌ
        Collections.sort(posts, (p1, p2) -> p1.date.compareTo(p2.date));
        this.itr = posts.iterator();
    }

    @Override
    public boolean hasNext() {
        return this.itr.hasNext(); // ์ž๋ฐ” ๋‚ด๋ถ€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ์œ„์ž„ํ•ด ๋ฒ„๋ฆผ
    }

    @Override
    public Post next() {
        return this.itr.next(); // ์ž๋ฐ” ๋‚ด๋ถ€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ์œ„์ž„ํ•ด ๋ฒ„๋ฆผ
    }
}
// ๊ฒŒ์‹œํŒ
class Board {
    // ๊ฒŒ์‹œ๊ธ€์„ ๋ฆฌ์ŠคํŠธ ์ง‘ํ•ฉ ๊ฐ์ฒด๋กœ ์ €์žฅ ๊ด€๋ฆฌ
    List<Post> posts = new ArrayList<>();

    public void addPost(String title, LocalDate date) {
        this.posts.add(new Post(title, date));
    }

    public List<Post> getPosts() {
        return posts;
    }

    // ListPostIterator ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜
    public Iterator<Post> getListPostIterator() {
        return new ListPostIterator(posts);
    }

    // DatePostIterator ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜
    public Iterator<Post> getDatePostIterator() {
        return new DatePostIterator(posts);
    }
}
public static void main(String[] args) {
    // 1. ๊ฒŒ์‹œํŒ ์ƒ์„ฑ
    Board board = new Board();

    // 2. ๊ฒŒ์‹œํŒ์— ๊ฒŒ์‹œ๊ธ€์„ ํฌ์ŠคํŒ…
    board.addPost("๋””์ž์ธ ํŒจํ„ด ๊ฐ•์˜ ๋ฆฌ๋ทฐ", LocalDate.of(2020, 8, 30));
    board.addPost("๊ฒŒ์ž„ ํ•˜์‹ค๋ถ„", LocalDate.of(2020, 2, 6));
    board.addPost("์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?", LocalDate.of(2020, 6, 1));
    board.addPost("์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?", LocalDate.of(2021, 12, 22));

    // ๊ฒŒ์‹œ๊ธ€ ๋ฐœํ–‰ ์ˆœ์„œ๋Œ€๋กœ ์กฐํšŒํ•˜๊ธฐ
    print(board.getListPostIterator());

    // ๊ฒŒ์‹œ๊ธ€ ๋‚ ์งœ๋ณ„๋กœ ์กฐํšŒํ•˜๊ธฐ
    print(board.getDatePostIterator());
}

public static void print(Iterator<Post> iterator) {
    Iterator<Post> itr = iterator;
    while(itr.hasNext()) {
        Post post = itr.next();
        System.out.println(post.title + " / " + post.date);
    }
}

Iterator-pattern

์ด์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฒŒ์‹œ๊ธ€์„ ์ˆœํšŒํ•  ๋•Œ Board ๋‚ด๋ถ€๊ฐ€ ์–ด๋–ค ์ง‘ํ•ฉ์ฒด๋กœ ๊ตฌํ˜„(Array, List, Tree, Queue ..๋“ฑ) ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๊ฐ์ถ”๊ณ  ์ „ํ˜€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ˆœํšŒ ์ „๋žต์„ ๊ฐ ๊ฐ์ฒด๋กœ ๋‚˜๋ˆ”์œผ๋กœ์จ ๋•Œ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋งŒ ๋ฐ›์œผ๋ฉด ๋˜‘๊ฐ™์€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ˆœํšŒ ์ฝ”๋“œ๋กœ ๋‹ค์–‘ํ•œ ์ˆœํšŒ ์ „๋žต์„ ๊ตฌ์‚ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ง‘ํ•ฉ์ฒด ๊ตฌํ˜„์— ์ƒ๊ด€ ์—†์ด ์ˆœํšŒ๋ฅผ ํ‘œํ˜„ โœ”๏ธ

Iterator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜๋‹ค๋ฅธ ์ด์œ ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ง‘ํ•ฉ์ฒด ๊ตฌํ˜„๊ณผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Iterator<Post> itr = iterator;
while(itr.hasNext()) {
    Post post = itr.next();
    System.out.println(post.title + " / " + post.date);
}

์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ• ๋•Œ hasNext() ์™€ next() ๋ผ๋Š” Iterator์˜ ๋ฉ”์†Œ๋“œ๋งŒ์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ง‘ํ•ฉ์ฒด์ธ Board์˜ ๋‚ด๋ถ€ ๊ตฌ์„ฑ์„ ๊ฐ์ถœ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์œ„์˜ while๋ฌธ์€ Board์˜ ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ง์€ ๋งŒ์ผ ์ถ”ํ›„์— Board์˜ ์ง‘ํ•ฉ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ Board ํด๋ž˜์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ Iterator๋งŒ์„ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ(์œ„์˜ while ๋ฃจํ”„)๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ๋œ๋‹ค.


์‹ค๋ฌด์—์„œ ์ฐพ์•„๋ณด๋Š” Iterator ํŒจํ„ด

 

Java

  • java.util.Enumeration ๊ณผ java.util.Iterator
  • Java StAX (Streaming API for XML)์˜ Iterator ๊ธฐ๋ฐ˜ API
    • XmlEventReader, XmlEventWriter

 

java.util.Enumeration

  • Iterator๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์ „ java 1.0๋ถ€ํ„ฐ ์žˆ์—ˆ๋˜ API
  • ๊ณผ๊ฑฐ์˜ ํด๋ž˜์Šค๋กœ์„œ, ํ˜„์žฌ๋Š” ์•ˆ์“ฐ๊ณ  Iterator๋กœ ๊ธฐ๋Šฅ์ด ๋Œ€์ฒด ๋˜์—ˆ๋‹ค.
  • java 9 ์—์„œ๋Š” Enumeration Iterator๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. asIterator()
Iterator Enumeration
์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜ ์ปค์„œ์ด๋ฉฐ ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Vector์™€ ๊ฐ™์€ ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜ ์ปค์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๊ถŒํ•œ๋งŒ ์žˆ๋‹ค.
๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ : hasNext(), next() ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ : hasMoreElements(), nextElement()
๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ๊ธฐ ๊ถŒํ•œ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ด๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
public static void main(String[] args) {
    Vector<Integer> rollno = new Vector<>();
    rollno.add(1);
    rollno.add(2);
    rollno.add(3);
    rollno.add(4);
    rollno.add(5);
    
    Enumeration<Integer> classNine = rollno.elements();

    // hasMoreElements(), nextElement() ๋กœ ์ˆœํšŒ
    while (classNine.hasMoreElements()) {
        System.out.println(classNine.nextElement());
    }
}

 

java.util.Iterator

  • hasNext() : ์ˆœํšŒํ•  ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
  • next() : ํ˜„์žฌ ์ปค์„œ์˜ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ์ปค์„œ๋ฅผ ์ด๋™
  • remove() : Iterator์—์„œ next()๋กœ ๋ฐ›์•˜๋˜ ํ•ด๋‹น ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ญ์ œ.
    • ๋ชจ๋“  ์ดํ„ฐ๋ ˆ์ดํ„ฐ์—์„œ ๋‹ค ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. UnsupportedOperationException()์„ ๋˜์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
    • ๋ณดํ†ต ์ด ๊ธฐ๋Šฅ์€ ๋™์‹œ์— ๋‹ค๋ฐœ์ ์œผ๋กœ ๊ฐ™์€ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด๋„ ์•ˆ์ „ํ•œ ์ปฌ๋ ‰์…˜์—์„œ ์ œ๊ณตํ•œ๋‹ค.
  • forEachRemaining() : ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ˆœํšŒ ์ฝ”๋“œ๋ฅผ ์‹ฌํ”Œํ™” ํ•ด์ค€๋‹ค
public static void main(String[] args) {
    Set<Integer> aggregate = new TreeSet<>(List.of(1,2,3,4,5));

    // hasNext(), next(), remove()
    Iterator<Integer> itr = aggregate.iterator();
    while(itr.hasNext()) {
        System.out.printf("%d ์‚ญ์ œ", itr.next());
        itr.remove();
    }

    System.out.println(aggregate); // []
}
public static void main(String[] args) {
    Set<Integer> aggregate = new TreeSet<>(List.of(1,2,3,4,5));

    // ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ while ๋ฌธ ์ฝ”๋“œ๋ฅผ for๋ฌธ์œผ๋กœ ์ถ•์•ฝํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.
    for (Iterator<Integer> i = aggregate.iterator(); i.hasNext();) {
        System.out.println(i.next());
    }

    // forEachRemaining()
    aggregate.iterator().forEachRemaining(System.out::println);
}

 

Java StAX (Streaming API for XML)

  • XML ํŒŒ์ผ ํฌ๋งท์„ ์ฝ๊ฑฐ๋‚˜ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ฝ˜์†” ๊ธฐ๋ฐ˜์˜ API, ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ API : xml์˜ Element๋งˆ๋‹ค ์ด๋ฒคํŠธ๊ฐ€ ์ง€๋‚˜๊ฐ€๋ฉด์„œ ์บก์ณํ•˜๋ฉฐ ๊ทธ ์˜์—ญ์„ ํ‘œํ˜„ํ•˜๋Š” XMLEvent๋ผ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. (XmlEventReader, XmlEventWriter)
    • ์ฝ˜์†” ๊ธฐ๋ฐ˜์˜ API : ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Element๋ฅผ ์ง€๋‚˜๊ฐ€๋ฉด์„œ ์ง์ ‘ ์•ˆ์˜ ๋‚ด์šฉ๋“ค์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜๋ณด๋‹ค ํšจ์œจ์ ์ด์ง€๋งŒ ์žฌ์‚ฌ์šฉ, ๋ณ€๊ฒฝ ์ธก๋ฉด์—์„œ๋Š” ์ข‹์ง€ ์•Š์•„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.
  • ๋น„์Šทํ•œ SAX(Simple API for XML)๋„ ์žˆ์ง€๋งŒ, SAX๋Š” XML์„ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ API ์ฝ”๋“œ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book title="์˜ค์ง•์–ด ๊ฒŒ์ž„"/>
    <book title="์ˆจ๋ฐ”๊ผญ์งˆ"/>
    <book title="์šฐ๋ฆฌ์ง‘์— ์™œ ์™”๋‹ˆ"/>
</books>
public static void main(String[] args) throws FileNotFoundException, XMLStreamException {

    // 1. XMLEventReader ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์–ป๋Š”๋‹ค.
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

    // 2. XMLEventReader ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
    XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream("book.xml"));

    // 3. ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ˆœํšŒํ•œ๋‹ค.
    while(reader.hasNext()) {
        // <books> ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์บก์ณํ•˜์—ฌ ๊ทธ ์˜์—ญ์„ ํ‘œํ˜„ํ•˜๋Š” XMLEvent ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
        XMLEvent nextEvent = reader.nextEvent();

        // ์—˜๋ฆฌ๋จผํŠธ์— ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
        if(nextEvent.isStartElement()) {
            StartElement startElement = nextEvent.asStartElement(); // <book>
            QName name = startElement.getName();
            if(name.getLocalPart().equals("book")) {
                // ์—˜๋ฆฌ๋จผํŠธ์˜ ์†์„ฑ์„ ์–ป๋Š”๋‹ค. <book title=""/>
                Attribute title = startElement.getAttributeByName(new QName("title"));
                System.out.println(title.getValue());
            }
        }
    }
}

Java StAX


Spring Framework

 

CompositeIterator

  • ๊ธฐ์กด์˜ Interator์— add ๊ธฐ๋Šฅ๋งŒ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•œ ๊ฒƒ
  • add() : ์—ฌ๋Ÿฌ Iterator๋“ค์„ ์กฐํ•ฉ(Composite)ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
public class IteratorInSpring {
 
    public static void main(String[] args) {
        CompositeIterator iterator;
    }
}

# ์ฐธ๊ณ ์ž๋ฃŒ

์ฝ”๋”ฉ์œผ๋กœ ํ•™์Šตํ•˜๋Š” GoF์˜ ๋””์ž์ธ ํŒจํ„ด - ๋ฐฑ๊ธฐ์„ 

https://refactoring.guru/design-patterns/iterator