반복자 패턴(Iterator Pattern)

박세건·2024년 5월 21일
0

디자인 패턴

목록 보기
7/17
post-thumbnail

반복자 패턴이란, 특정한 데이터 집합에 순차적인 접근을 지원하는 행위 패턴
일반적인 데이터 집합인 배열이나 List 같은 집합은 for문을 통해서 간단하게 순회 가능
하지만, 해시 트리처럼 데이터의 순서가 정해지지 않고 저장되는 컬렉션들을 순회하는 기준이 애매하다.
이러한 복잡한 컬렉션들을 순회하는 전략을 정의하는 것이 Iterator 패턴 이다.
추가적으로 Iterator를 통한 순회는 내부 구조를 노출시키지 않는다는 장점도 있다

구조

정해진 데이터 집합은 데이터를 조회할 수 있도록 Iterator 인터페이스를 상속받는 객체를 제공한다.

Iterator 인터페이스는 각각의 필드 정보를 소유 하고 있다

  • hasNext() : 다음 원소가 존재하는지
  • next() : 다음 원소를 리턴

사용 시기

  • 순회 방식을 통일 하기위해
  • 컬렉션을 순회하는 여러가지 방법을 제공하고 싶을때
  • 컬렉션의 내부 구조를 숨기고 싶을때

장점

  • 여러 형태의 컬렉션에 대해 동일 한 순회 방법을 제공
  • 내부 구조를 숨길 수 있다 -> OCP 준수
  • 컬렉션의 변경사항이 있어도 iterator에는 문제가 없음 -> 결합도 감소
  • 컬렉션 순회의 책임을 iterator로 분리 -> SRP 원칙 준수

단점

  • 클래스가 많아지고 복잡도 증가

예시 코드

  • 클래스의 내부 구조가 노출
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를 사용하므로 내부 구조를 숨김 오로지 결과만 보여줄 수 있음
  • 오로지 hasNext()와 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);
    }
}
profile
멋있는 사람 - 일단 하자

0개의 댓글