본문 바로가기
Study/CS

[CS] 디자인패턴 - 이터레이터, 노출모듈

by dev_kong 2023. 1. 9.
728x90
728x90

이터레이터(Iterator) 패턴

 

이터레이터 패턴이란
이터레이터를 사용하여, 컬렉션의 요소들에 접근하는 디자인패턴

예제 코드

 

Book이라는 객체를 모아둔 컬렉션(집합체)를 순회하는 Iterator를 구현 해보려고 한다.

 

public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

public interface Aggregate {
    public abstract Iterator createIterator();
}

public class BookShelf implements Aggregate {

    private Book[] books;
    private int last = 0;

    public BookShelf(int size) {
        books = new Book[size];
    }

    public Book getBook(int index) {
        return books[index];
    }

    public int getLength() {
        return last;
    }

    public void appendBook(Book book) {
        if (last < books.length) {
            this.books[last] = book;
            last++;
        } else {
            System.out.println("꽉 참");
        }
    }

    @Override
    public Iterator createIterator() {
        return new BookShelfIterator(this);
    }
}

 

public class BookShelfIterator implements Iterator<Book> {
    private final BookShelf bookShelf;
    private int index = 0;

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

    @Override
    public boolean hasNext() {
        return index < bookShelf.getLength();
    }

    @Override
    public Book next() {
        Book book = bookShelf.getBook(index);
        index++;
        return book;
    }
}

next()는 다음번 요소를 반환하고, hasNext()는 다음 인덱스에 값이 있는지 여부를 판별한다.

 

 

public static void iterator() {
        BookShelf bookShelf = new BookShelf(5);

        Book abc = new Book("abc");
        Book def = new Book("def");
        Book ghi = new Book("ghi");

        bookShelf.appendBook(abc);
        bookShelf.appendBook(def);
        bookShelf.appendBook(ghi);

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

이거 왜함..?

그냥 for문 돌리면 되지 이걸 왜 하나 싶다.

 

검색을 해보니,
집합을 가진 객체와 원소를 탐색하는 영역을 분리 할 수 있고 각각의 구현이 간단하다.
즉, 집합을 가친객체(위에서는 BookShelf)의 구현에 의존하지 않는다.

 

음. 뭔가 순수객체지향의 끝에 다다라서 '뭐 더 할거 없나...' 싶을 때 쯤 나온 개념이 아닌가 싶을 정도로.
실용적이진 못한거 같다...

 

노출 모듈 패턴

 

노출 모듈 패턴이란
즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴

이거 왜하나 싶은데
Javascript는 접근제어자가 없다.

 

접근제어자가 없는 불쌍한 Javascript에게
접근제어자가 있는 것 처럼 사용하기 위한 패턴 이다.

(Typescript는 무너졌냐..?)

 

const pukuba = (() => {
    const a = 1;
    const b = () => 2;

    const public = {
        c : 2,
        d: () => 3
    }
    return public;
})();

console.log(pukuba); // {c : 2, d : [Function: d]}
console.log(pukuba.a); // undefined
728x90
728x90

댓글