이터레이터 패턴
이터레이터 패턴
이터레이터 패턴은 소프트웨어 디자인 패턴 중 하나로, 컬렉션(데이터의 집합)을 반복(iterate)하면서 내부
구조를 노출하지 않고 순차적으로 접근할 수 있는 방법을 제공하는 패턴입니다.
이터레이터 패턴은 객체 지향 프로그래밍에서 많이 사용되며, 컬렉션의 내부 구조가 변경되더라도
이터레이터 인터페이스를 수정하지 않고도 반복 동작을 유지할 수 있도록 도와줍니다.
이터레이터 패턴 주요 컴포넌트
Iterator (이터레이터):
컬렉션 내의 항목들을 반복하는 인터페이스를 정의합니다.
주로 next() 메서드와 현재 위치나 종료 여부를 판단하는 hasNext() 메서드를 포함합니다.
Concrete Iterator (구체적인 이터레이터):
Iterator 인터페이스를 구체화하여 실제로 컬렉션을 반복하는 구현을 제공합니다.
컬렉션의 내부 데이터 구조를 알고 있으며, 컬렉션 내 항목들을 순차적으로 반환하는 역할을 합니다.
Aggregate (집합체):
컬렉션을 나타내는 인터페이스를 정의합니다.
주로 이터레이터 객체를 생성하는 메서드를 포함하며, 클라이언트가 컬렉션을 반복하는 데 필요한
인터페이스를 제공합니다.
Concrete Aggregate (구체적인 집합체):
Aggregate 인터페이스를 구체화하여 실제 컬렉션을 생성하는 역할을 합니다.
내부적으로 컬렉션의 데이터를 저장하고 이터레이터 객체를 생성하여 반환합니다.
이터레이터 패턴 장점
분리된 관심사:
이터레이터 패턴은 컬렉션의 내부 구조와 반복 동작을 분리시켜 유지보수성을 향상합니다.
컬렉션의 변경이 반복 알고리즘에 영향을 미치지 않으므로, 코드의 수정 범위를 줄이고 실수를 방지할 수
있습니다.
유연성과 확장성:
새로운 종류의 컬렉션을 추가하거나 반복 동작을 변경할 때, 기존의 코드를 수정하지 않고도
새로운 이터레이터 구현을 추가할 수 있습니다.
이는 코드의 재사용성과 확장성을 높이는 데 도움이 됩니다.
캡슐화와 보안:
컬렉션의 내부 데이터 구조를 외부로 노출하지 않고도 반복 접근을 제공하므로,
데이터의 캡슐화와 보안을 더 쉽게 유지할 수 있습니다.
일관성 있는 반복 인터페이스:
이터레이터 패턴을 사용하면 다양한 종류의 컬렉션에 대해 동일한 인터페이스를 사용하여
반복할 수 있습니다.
이로 인해 클라이언트 코드가 단순화되고 일관성을 유지할 수 있습니다.
이터레이터 패턴 단점
추가적인 복잡성:
이터레이터 패턴을 도입하면 컬렉션과 이터레이터의 구조가 더 추가됩니다.
작은 규모의 프로젝트나 단순한 반복 동작의 경우에는 이러한 추가 복잡성이 불필요할 수 있습니다.
성능 이슈:
일부 언어나 환경에서 이터레이터 패턴을 사용하면 성능에 약간의 손실이 발생할 수 있습니다.
이는 추가적인 객체 생성과 메서드 호출로 인해 발생할 수 있습니다.
비슷한 기능의 표준 라이브러리:
많은 프로그래밍 언어와 라이브러리에서는 이미 이터레이션을 위한 표준 라이브러리나 내장 함수를
제공합니다.
이 경우에는 별도의 이터레이터 패턴을 구현하는 대신 내장 기능을 활용하는 것이 더 간단하고
효율적일 수 있습니다.
이터레이터 패턴은 프로젝트의 크기, 요구 사항, 개발 환경 등에 따라 적합한 상황이 다를 수 있습니다.
패턴을 적용할 때는 이러한 장단점을 고려하여 패턴의 적절성을 판단하는 것이 중요합니다.
이터레이터 종류
이터레이터는 집합체로부터 정보를 얻어 내는 것을 의미한다.
각 정보를 얻어와서 필요한 상황에 맞게 적용 하면 된다.
Iterator 메소드에는 hasNext(), next(), remove()가 있다.
hasNext() : 읽어올 요소가 남아있는지 확인하는 메소드이다. 요소가 있으면 true, 없으면 false
next() : 다음 데이터를 반환한다.
remove() : next()로 읽어온 요소를 삭제한다.
메소드 호출 순서는 hasNext() -> next() -> remove()
이터레이터 패턴 자세히 알기!
한 학교에서 학생들이 수업을 듣고 있습니다.
이 학교에서는 매일 아침마다 모든 학생들이 등교하면서 출석을 체크해야 합니다.
이때 학생들의 목록을 이터레이터 패턴을 사용하여 관리하고자 합니다.
Iterator 인터페이스:
모든 학생들을 대상으로 출석 체크하는 역할을 정의합니다.
출석을 체크한 학생을 반환하는 next() 메서드와, 더 이상 출석 체크할 학생이 남아있는지
확인하는 hasNext() 메서드가 포함됩니다.
Concrete Iterator (구체적인 이터레이터):
학생 목록을 순회하며 출석을 체크하는 구체적인 클래스입니다.
next() 메서드를 호출할 때마다 다음 학생을 반환하고, hasNext() 메서드로 아직 출석 체크되지 않은
학생이 있는지 확인합니다.
Aggregate 인터페이스:
모든 학생들의 목록을 표현하는 인터페이스입니다.
출석 체크를 위한 이터레이터를 생성하는 createIterator() 메서드가 정의됩니다.
Concrete Aggregate (구체적인 집합체):
학생들의 목록을 저장하고 출석 체크를 위한 이터레이터를 생성하는 구체적인 클래스입니다.
이제 해성이라는 학생이 등장하는 상황을 생각해보겠습니다.
학생들의 목록을 컬렉션(예: ArrayList)으로 저장합니다.
이터레이터 패턴을 사용하여 학생들의 목록을 순회하며 출석을 체크합니다.
학교에서 해성이가 등장하면, 목록에 해성이를 추가하고 이터레이터 패턴을 사용하여 목록을 순회합니다.
기존의 이터레이터 코드를 수정하지 않아도 새로운 학생도 출석 체크할 수 있습니다.
이처럼 이터레이터 패턴을 사용하면 새로운 학생이 등장하거나 기존 학생들의 출석 체크를 변경야 할 때,
기존의 코드를 수정하지 않고도 새로운 학생을 포함한 모든 학생들을 순회하고 처리할 수 있습니다.
*바쁜 사람을 위한 깜찍한 정리
이터레이터 패턴은 컬렉션을 반복하면서 내부 구조를 노출하지 않고 순차적으로 접근할 수 있는 방법을 제공하는 패턴입니다. 예를 들어 슈퍼마켓에서 새로운 물건이 들어오면 상품 목록에 추가를 해야 하는 상황인데 이터레이터 패턴을 이용하면 새로운 물건이 들어오는 시점부터 다시 처음부터 순회하여 목록 리스트에 채워지는 효과를 얻을 수 있습니다. 또한 어떤 물건을 제외하고 싶을 때는 해당 상품 진열대까지 가서 물건을 들고 버릴 필요 없이 상품 목록에서만 지워주면 다시 처음부터 순회하여 그 물건이 해당 진열대(각각 메서드)를 건들 필요가 없어져서 유지보수에서도 좋음 이점을 얻는 장점이 있습니다.
'목차훔치기 > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
MVC 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.14 |
---|---|
노출모듈 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.13 |
프록시 패턴과 프록시 서버(면접을 위한 CS 전공지식 노트) (0) | 2023.08.11 |
옵저버 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.10 |
전략 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.09 |