18.1 개요
프로그램을 하다 보면 개체들을 보관하는 컬렉션 개체를 사용하는 것은 매우 흔한 일입니다. 그리고, 컬렉션의 안전성을 유지하기 위해서는 개체를 보관하는 공간을 직접적으로 노출시키지 않게 됩니다. 하지만 사용자의 경우 컬렉션에 보관된 개체들의 정보를 검색할 수 있어야 하며 경우에 따라서는 보관된 개체들에 대해 반복된 작업을 수행하기를 원하는 경우가 있습니다. 반복자 패턴은 컬렉션 개체의 내부 저장 공간에 대해 직접적으로 노출하는 것을 막으면서 보관된 개체들에 대해 반복된 작업을 수행할 수 있는 방법을 제공하고자 할 때 사용하는 패턴입니다.
반복자 패턴에서는 컬렉션을 반복 순회하면서 작업을 수행할 필요가 있을 때 순회할 수 있는 도구 개체를 정의합니다. 그리고, 사용자는 컬렉션을 통해 순회자 개체를 얻을 수 있으며 순회자를 통해 컬렉션에 보관된 개체들에 대해 반복적인 작업을 수행할 수 있게 합니다. 컬렉션 형식에 상관없이 순회 방법을 추상화하면 사용자는 여러 컬렉션을 동일한 방법으로 사용할 수 있게 됩니다. C#에서는 컬렉션에 대한 순회 방법을 추상화하여 IEnumerator, IEnumerable 인터페이스를 제공하고 있습니다.
“반복자 패턴은 컬렉션 내부 저장 공간의 노출을 막으면서
반복 작업을 수행할 수 있는 방법을 제공”
18. 2 시나리오
EH Camera 회사 객원 감수자가 된 지도 3개월이 지나가고 있습니다. 이제 개발 팀과 대화를 하는 방법도 나아져서 나의 의견을 전달하거나 개발 팀의 의견을 수용할 때 비용이 많이 줄어든 것 같아요. 어제는 개발 팀의 나 망원 씨께서 사진이나 그 외 많은 자료들을 보관하고 관리하는 응용을 작성할 때마다 라이브러리 파트에서는 새로운 컬렉션을 작성하고 응용 파트에서는 이를 사용하는 방법을 다시 익혀야 하는 비용때문에 효과적인 작업을 못하는 것 같다는 얘기를 하네요. 처음에 객원 감수자가 되었을 때에는 이 매핑 씨를 통해 의견을 전달받거나 전달하였는데 처음으로 개발 팀원이 직접 질의를 해 왔어요.
이번 질의는 개발 팀원이 처음으로 직접한 질문이라 제가 하는 작업 공정을 보여주고 싶다는 생각이 들었어요. 그래서 개발 팀의 한 자리를 빌려 작업을 시작하였습니다. 제일 먼저, 컬렉션들이 공통적으로 제공해야 할 것들에 대한 추상적인 약속을 하였습니다. 그리고, 보관된 개체들에 대해 반복적인 작업을 할 때 사용할 부분은 별도의 순회자로 추상화를 하였죠. 추상화 작업을 한 후에는 EH Camera 회사에서 사용하고 있는 여러 종류의 컬렉션의 종류들을 파악하여 추상화 된 컬렉션 기반의 클래스와 추상 순회자 기반의 순회자들을 정의를 하였습니다. 그리고, 간단히 배열 형식의 클래스를 정의하고 배열에 사용할 순회자를 정의한 후에 이를 테스트하는 응용을 작성하였죠. 그리고, 설계 문서와 간단한 기술 문서와 데모에 대한 문서를 작성하여 나망원 씨에게 전달하였습니다.