peacekim
할 수 있는 것과 할 수 없는 것.
peacekim
전체 방문자
오늘
어제
  • 분류 전체보기 (68)
    • 👨‍🏫ps (44)
      • ❄️프로그래머스 (20)
      • 🔟0️⃣백준 (21)
      • leetcode (3)
    • ✍🏻study (20)
      • 👐java (6)
      • 🍃spring (1)
      • 🥇algorithm (0)
      • 🚘oodp (4)
      • 📒 jpa (3)
      • 👣DB (2)
      • 🌂네트워크 (0)
      • 🎸기타 (3)
      • 👊 kotlin (1)
      • 🫥 jvm (0)
    • 📽project (4)
      • 🎀ReBoN (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
peacekim

할 수 있는 것과 할 수 없는 것.

이터레이터 패턴이란❓
✍🏻study/🚘oodp

이터레이터 패턴이란❓

2022. 9. 13. 22:20
반응형

이터레이터 패턴

행동 패턴이란?🤔

어떤 처리의 책임을 어느 객체에 할당하는 것이 좋은지, 알고리즘은 어느 객체에 정의하는 것이 좋은지 다루는 
패턴.

이터레이터 패턴이란?🤔

집합 객체를 순회하는 패턴
집합 객체의 "내부 구조"를 "노출시키지 않고", 순회하는 방법을 제공하는 패턴.
내부 구조를 들어내지 않고 클라이언트가 요소들을 순회할 수 있도록 한다.

집합 객체를 순회는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다.
집합 객체를 순회하는 다양한 방법을 지원하고 싶을 때
	- 트리를 순회 방법.(ex. 중위 순회, 전위 순회, 후위 순회)
	- 객체의 특성에 따라 원하는 대로 Iterator를 구현하여, 순회 가능

Aggregate: 집합체를 의미하는 인터페이스. Iterator를 만들어내는 인터페이스!!

ConcreteAggregate: Aggregate 구현체

Iterator: 컬렉션 요소들을 순서대로 검색하기 위한 인터페이스

ConcreteIterator: iterator 구현체

코드⌨️

먼저 집합 객체 만들어 놓고, 그것들을 원하는 대로 순회하는 코드 만들기 커스텀할 수 있는 것

클라이언트 코드가 객체 안을 알 필요가 없어야 된다.

RecentPostIterator(ConcreteIterator)

public class RecentPostIterator implements Iterator<Post> {

    private Iterator<Post> internalIterator;

    public RecentPostIterator(List<Post> posts) {
        Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
        this.internalIterator = posts.iterator();
    }

    @Override
    public boolean hasNext() {
        return this.internalIterator.hasNext();
    }

    @Override
    public Post next() {
        return this.internalIterator.next();
    }
}

Board(ConcreteAggregate)

public class Board {

    List<Post> posts = new ArrayList<>();

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

    public void addPost(String content) {
        this.posts.add(new Post(content));
    }

    public Iterator<Post> getRecentPostIterator() {
        return new RecentPostIterator(this.posts);
    }

}

Client

public class Client {

    public static void main(String[] args) {
        Board board = new Board();
        board.addPost("디자인 패턴 게임");
        board.addPost("선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?");
        board.addPost("지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다.");

        // TODO 들어간 순서대로 순회하기
        List<Post> posts = board.getPosts();
        Iterator<Post> iterator = posts.iterator();
        System.out.println(iterator.getClass());

        for (int i = 0 ; i < posts.size() ; i++) {
            Post post = posts.get(i);
            System.out.println(post.getTitle());
        }

        // TODO 가장 최신 글 먼저 순회하기
        Iterator<Post> recentPostIterator = board.getRecentPostIterator();
        while(recentPostIterator.hasNext()) {
            System.out.println(recentPostIterator.next().getTitle());
        }
    }

}

장단점🤭

장점

1. 집합 객체가 가지고 있는 객체들을에 손쉽게 접근할 수 있다.
-> 집합 객체가 어떠한 구조로 되어있는 지 알필요 없이 Iterator만 알면 된다.
-> hasNext와 next만 알면 모든 집합을 순회 할 수 있다.
-> 순회하는 로직만 책임을 분리해서 iterator 인터페이스가 가지고 있고, 
	 그것을 분리해놓 기 때문에, SRP를 지킨다.
2. 일관된 인터페이스를 사용해 여러 형태의 집합 구조를 순회할 수 있다.

단점

1. 어김없는 코드가 복잡하다,,,

변경될 집합 객체를 순회하고 있고, 이 집합 객체가 변경될 가능성이 있다면, 이터레이터 패턴을 사용하여, 순회 과정을 숨길 때 사용하면 좋을 것이다.

자바와 스프링에서는 어디서 사용될까?🤔

자바

1. java.util.Enumeration, java.util.Iterator
-> 둘다 자바에서 제공하는 컬렉션에 대해 각 컬렉션의 항목들을 순차적으로 접근하는데 사용된다.
-> Iterator는 Enumeration의 기능을 확장했다.
-> Iterator는 remove 메서드를 통해 원본 컬렉션의 데이터를 삭제할 수 있다.
2. Java StAX(Streaming API for XML)의 iterator 기반 API
-> 콘솔 기반의 API, 이터레이터 기반의 API를 제공함.
-> XML 코드를 순회를 한다.

스프링

1. CompositeIterator
-> 기존의 Iterator에 기능(add)을 추가한 것

Reference

  • 코딩으로 학습하는 GoF의 디자인 패턴 - 백기선님 강의
반응형

'✍🏻study > 🚘oodp' 카테고리의 다른 글

브릿지 패턴이란❓  (0) 2022.08.29
Builder패턴, 그리고 Builder annotation는 뭘까🧐  (2) 2022.03.15
DI가 뭔데?  (0) 2022.03.11
    '✍🏻study/🚘oodp' 카테고리의 다른 글
    • 브릿지 패턴이란❓
    • Builder패턴, 그리고 Builder annotation는 뭘까🧐
    • DI가 뭔데?
    peacekim
    peacekim
    할 수 있는 것과 할 수 없는 것. github: https://github.com/PyeongGangKim

    티스토리툴바