티스토리 뷰
이터레이터 패턴(Iterator Pattern)
📝 한글로는 반복자 패턴이라고 부르는데 집합 객체(aggregate object)에 내부를 노출시키지 않고 원소들을 순차적으로 접근하는 방법을 제공하는 디자인 패턴이다.
객체 모델
⚙️ ConcreteAggregate
public class ConcreteAggregate<T> implements Aggregate<T>{
Object[] aggregate;
private int size;
public ConcreteAggregate(Object[] aggregate) {
this.aggregate = aggregate;
this.size = aggregate.length;
}
@Override
public Iterator<T> createIterator() {
return new ConcreteIterator<T>(this.aggregate, size);
}
}
⚙️ ConcreteIterator
public class ConcreteIterator<T> implements Iterator<T>{
private int cursor;
private int size;
private Object[] aggregate;
public ConcreteIterator(Object[] aggregate, int size) {
this.cursor = 0;
this.size = size;
this.aggregate = aggregate;
}
@Override
public T getNext() {
return (T) aggregate[cursor++];
}
@Override
public boolean hasNext() {
return size > cursor;
}
}
- Cursor와 Size를 통해 다음 요소가 있는지 판단한다.
- Cursor를 통해 현재 반복자가 제공해야 하는 요소를 판단한다.
🏃 Client
public class Client {
public static void main(String[] args) {
Object[] objectArray = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9 ,10).toArray();
Aggregate<Integer> aggregate = new ConcreteAggregate<>(objectArray);
Iterator<Integer> iterator = aggregate.createIterator();
while (iterator.hasNext()) {
Integer next = iterator.getNext();
if (!iterator.hasNext()) {
System.out.print(next);
break;
}
System.out.print(next + " ,");
}
}
}
결과
⚠️ 추가 고려 사항
- 순회 알고리즘이 집합 객체가 아닌 이터레이터에 있는 것이 집합 객체 외부에서 집합 객체의 원소를 접근한 것이기 때문에 캡슐화를 위반한 것으로 볼 수 있다. 때문에, 자바의 ArrayList 는 이터레이터의 구현체를 내부 클래스로 가지고 있는 것으로 추측된다.
- 반복자가 순회하는 과정에 요소가 추가되었을 때에 대한 대책이 필요하다.
👍 장점
- 다형성을 지닌 반복(Polymorphic iteration)이 가능하다.
- 일관된 인터페이스로 여러 형태의 집합구조를 순회할 수 있다.
- 자바에서 List, Set 등 다양한 컬렉션 객체에 내부를 순회하기 위해 Iterator라는 공통된 인터페이스를 제공하는 것을 예 로들 수 있다.
- 집합 객체의 원소들을 손쉽게 접근할 수 있다.
𝌞 예제코드
😮 느낀 점
지금까지 Java에서 Iterator를 많이 사용해보지 않았다. 별로 필요성을 느끼지 못해서다.
하지만 반복자 패턴을 학습하면서 다형성을 지닌 반복이라는 키워드로 어느 상황에 필요한지 느낄 수 있었던 점이 좋았다.
참조
OpenJDK의 ArrayList 구현체(링크 아님)
'architecture > Design Pattern' 카테고리의 다른 글
[디자인 패턴] 커맨드 패턴 (Command Pattern) (0) | 2022.09.28 |
---|---|
[디자인 패턴] 책임 연쇄 패턴(CHAIN OF RESPONSIBILITY) (0) | 2022.09.25 |
[디자인 패턴] 플라이웨이트 패턴 (Flyweight pattern) (2) | 2022.09.24 |
[디자인 패턴] 파사드 패턴(Facade Pattern) (0) | 2022.09.23 |
[디자인 패턴] 프록시와 데코레이터 패턴 (0) | 2022.09.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 정적 타입 언어
- 세션 불일치
- 외부 단편화
- 메모리 파편화
- 메모리 단편화
- 동적 타입 언어
- SpringBoot 2.2
- 장애 해결기
- ATDD
- pool
- Object Pool
- OOP
- 컴포짓 패턴
- multimap
- pass by value
- 내부 단편화
- 수직 분할
- pass by reference
- 동적 디스패치
- 클린 아키텍처
- 객체 풀
- Sticky Session
- Session
- 육각형 아키텍처
- 뾰족함
- java
- 수평 분할
- Clean Architecture
- Memory Fragmentation
- RestAssured
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함