7.3 IEnumerable 과 IEnumerator 인터페이스
특정 클래스가 IEnumerable 인터페이스를 구현했다면, Enumerator를 사용해서 내부의 데이터를 순방향으로만 접근할 수 있도록 지원한다는 것을 의미합니다. 즉, Enumerable이라는 영어 철자 그대로 나열할 수 있다는 뜻입니다. Enumerator형으로 얻은 객체는 읽기전용 커서(Cursor)를 제공하고 있으며 데이터의 집합에 대한 순방향용으로 검색할 수 있습니다. IEnumerable 인터페이스에는 GetEnumerator() 메서드를 사용하여 IEnumerator를 얻어서 작업을 합니다. 다음은 IEnumerable 인터페이스의 프로토타입입니다.
▣ IEnumerable 인터페이스의 메서드 |
□ public interface IEnumerable {
□ IEnumerator GetEnumerator();
□ } |
IEnumerable 인터페이스
IEnumerable 인터페이스는 내부에 GetEnumerator() 추상메서드(Abstract Method)를 포함하고 있으며 이 메서드를 이용하여 Enumerator의 인스턴스를 얻을 수 있습니다. Enumerator는 현재 커서 위치에서 데이터를 추출하는 기능을 지원하며, 커서를 데이터 집합의 시작점으로 돌리는 기능도 제공합니다. 물론, 순방향으로 검색기능을 제공하는 것은 당연한 소리입니다. 예를 들어, Array 타입은 IEnumerable 인터페이스를 지원합니다. 배열은 Array 클래스를 상속하고 있으며 Array 클래스는 이 인터페이스를 구현하였기 때문에 IEnumerator를 사용할 수 있는 것입니다. 다음 프로그램은 배열에서 IEnumerable 인터페이스를 사용하는 방법을 보여주는 예제입니다.
& |
IEnumerableTest.cs |
Ü IEnumerable을 테스트하는 예제 |
using System;
using System.Collections;
public class IEnumerableTest { public static void Main() { string[ ] authors = {"A","B","C","D","E","F"}; IEnumerator e = authors.GetEnumerator(); while(e.MoveNext()) { Console.WriteLine(e.Current); } } //main } //class
|
C:\C#Example\07>csc IEnumerableTest.cs
C:\C#Example\07>IEnumerableTest
A
B
C
D
E
F |
이 프로그램은 6개의 문자를 보관하는 authors라는 스트링(String) 배열을 선언하였습니다.
string[ ] authors = {"A","B","C","D","E","F"};
Enumerator 객체를 얻기 위해서 authors.GetEnumerator()가 호출되었습니다. 모든 배열은IEnumerator 인터페이스를 구현해 놓았으므로 배열에 대해서 GetEnumerator() 메서드를 호출할 수 있습니다.
IEnumerator e = authors.GetEnumerator();
Enumerator 객체를 얻은 후 순방향으로 순회하기 위해서 while 루프에서 MoveNext() 메서드를 호출하고 있습니다. 그리고, MoveNext()로 커서를 움직인 후 현재의 커서가 위치한 곳에 데이터를 추출하기 위해서 Current 속성을 이용하고 있습니다. 이 때 Current의 타입은 Object형입니다.
while(e.MoveNext() == true) {
Console.WriteLine(e.Current);
}
IEnumerator에 대해서 조금 더 알아보도록 하겠습니다.
IEnumerator 인터페이스
IEnumerator는 내부에서 IEnumerable을 사용하는 인터페이스로서 데이터의 검색 기능을 제공해 줍니다. 다음은 IEnumerator 인터페이스 내부의 멤버를 보여주고 있습니다. IEnumerator를 사용한다는 것은 다음 멤버 3개를 사용하는 것과 같습니다.
▣ IEnumerator 속성 |
□ object Current
· 컬렉션에서 현재 객체에 대한 참조(Element)를 반환하는 읽기전용 속성 |
▣ IEnumerator 메서드 |
□ bool MoveNext();
· 열거자를 컬렉션의 다음 요소(Element)로 커서를 이동시킨다.
· 다음 요소가 존재하지 않는다면 false를 존재한다면 true를 리턴한다.
· 커서를 이동시킨 뒤 Current 속성을 이용하여 데이터를 추출할 수 있다.
□ void Reset();
· Current 포인터를 컬렉션의 처음 부분 앞에 있는 정의하지 않은 값으로 다시 설정한다.
· Reset을 호출한 후 Current를 접근하기 전에 MoveNext()를 호출해야 한다. 이유는 처음에는 Current 참조가 정의되어 있지 않기 때문이다. |
그림 7-2 Enumerator에서의 커서
Enumerator 객체가 생성될 때 항상 처음의 인덱스보다 한 칸 앞에 위치하게 됩니다. 데이터를 추출하기 전에 MoveNext() 메서드를 호출하여 커서의 위치를 추출하고자 하는 데이터의 위치로 이동시켜 주어야 합니다. 그리고, Current 속성을 이용하여 데이터를 추출합니다. Enumerator 객체가 컬렉션의 마지막 위치에 있을 때 MoveNext() 메서드를 호출하면 false가 반환됩니다. 따라서, 컬렉션 내의 모든 데이터에 대해서 MoveNext() 메서드가 true를 반환하는 동안은 루프를 수행하면서 false가 반환되면 빠져 나오는 방법으로 데이터를 검색할 수 있습니다. 검색을 하는 도중 커서의 위치를 처음으로 되돌리고자 한다면 Reset() 메서드를 사용하시면 처음으로 커서를 되돌려 줍니다.
결론적으로 IEnumerator 인터페이스는 열거형태로 되어 있는 System.Object 타입의 집합에 대해 순차적으로 접근할 수 있는 메서드를 가지고 있습니다. IEnumerator 인터페이스를 상속한 클래스는 컬렉션을 열거할 수 있기 때문에 모든 요소(Element)에 접근할 수 있습니다. |