본문 바로가기
목차훔치기/면접을 위한 CS 전공지식 노트

이터레이터 패턴(면접을 위한 CS 전공지식 노트)

by 해삼2 2023. 8. 12.
728x90
반응형
이터레이터 패턴

이터레이터 패턴

이터레이터 패턴은 소프트웨어 디자인 패턴 중 하나로, 컬렉션(데이터의 집합)을 반복(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)으로 저장합니다.
이터레이터 패턴을 사용하여 학생들의 목록을 순회하며 출석을 체크합니다.
학교에서 해성이가 등장하면, 목록에 해성이를 추가하고 이터레이터 패턴을 사용하여 목록을 순회합니다.

기존의 이터레이터 코드를 수정하지 않아도 새로운 학생도 출석 체크할 수 있습니다.
이처럼 이터레이터 패턴을 사용하면 새로운 학생이 등장하거나 기존 학생들의 출석 체크를 변경야 할 때,

기존의 코드를 수정하지 않고도 새로운 학생을 포함한 모든 학생들을 순회하고 처리할 수 있습니다.

 

 

 

*바쁜 사람을 위한 깜찍한 정리

이터레이터 패턴은 컬렉션을 반복하면서 내부 구조를 노출하지 않고 순차적으로 접근할 수 있는 방법을 제공하는 패턴입니다. 예를 들어 슈퍼마켓에서 새로운 물건이 들어오면 상품 목록에 추가를 해야 하는 상황인데 이터레이터 패턴을 이용하면 새로운 물건이 들어오는 시점부터 다시 처음부터 순회하여 목록 리스트에 채워지는 효과를 얻을 수 있습니다. 또한 어떤 물건을 제외하고 싶을 때는 해당 상품 진열대까지 가서 물건을 들고 버릴 필요 없이 상품 목록에서만 지워주면 다시 처음부터 순회하여 그 물건이 해당 진열대(각각 메서드)를 건들 필요가 없어져서 유지보수에서도 좋음 이점을 얻는 장점이 있습니다.
728x90
반응형