2. IEnumerator 인터페이스
`IEnumerator` 인터페이스는 컬렉션의 요소를 하나씩 순회하는 데 사용됩니다.
이 인터페이스는 다음과 같은 세 가지 멤버를 정의합니다:
public interface IEnumerator
{
object Current { get; } // 현재 위치의 요소 반환
bool MoveNext(); // 다음 요소로 이동하여 요소가 있으면 true를 반환, 없으면 false를 반환
void Reset(); // 열거자를 초기 상태로 되돌림
}
`Current` 속성은 현재 위치의 요소를 반환하며,
`MoveNext()` 메서드는 다음 요소로 이동하고 요소가 있으면 `true`를 반환합니다.
`MoveNext()`가 `false`를 반환하면 더 이상 요소가 없는 것으로 간주되어 순회가 종료됩니다.
`Reset()` 메서드는 열거자를 초기 상태로 되돌립니다.
`IEnumerator` 인터페이스를 직접 구현하는 것보다는 보통 `yield return`을 사용하여 메서드를 작성하면 C# 컴파일러가 내부적으로 이 인터페이스를 구현한 클래스를 생성합니다.
### 예제
다음은 `IEnumerable`과 `IEnumerator`을 사용하여 간단한 컬렉션을 순회하는 예제입니다:
using System;
using System.Collections;
public class MyCollection : IEnumerable
{
private int[] data;
public MyCollection(int[] array)
{
data = array;
}
public IEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
private class MyEnumerator : IEnumerator
{
private int[] _data;
private int _position = -1; // 초기 위치는 -1
public MyEnumerator(int[] array)
{
_data = array;
}
public object Current
{
get
{
try
{
return _data[_position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
public bool MoveNext()
{
_position++;
return (_position < _data.Length);
}
public void Reset()
{
_position = -1;
}
}
}
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3, 4, 5 };
MyCollection collection = new MyCollection(numbers);
foreach (int num in collection)
{
Console.WriteLine(num);
}
}
}
이 예제에서 `MyCollection` 클래스는 `IEnumerable`을 구현하여 `GetEnumerator()` 메서드를 제공합니다. `GetEnumerator()` 메서드는 `MyEnumerator` 클래스의 인스턴스를 반환하여 컬렉션을 순회합니다. `MyEnumerator` 클래스는 `IEnumerator` 인터페이스를 구현하여 순회 동작을 정의합니다.
이를 통해 `foreach` 문을 사용하여 `MyCollection` 객체를 순회할 수 있습니다.
참고 자료
chatGPT
https://velog.io/@dohui/C-IEnumerator-IEnumerable-yield
'UNITY > C#' 카테고리의 다른 글
리스트와 딕셔너리 (0) | 2024.11.22 |
---|---|
=> 연산자 (람다 표현식) (0) | 2024.10.21 |
C# Statements :: using, yield (0) | 2024.06.24 |
C# 특수 문자 :: $(문자열 보간)와 @(약어 식별자) (0) | 2024.06.24 |