본문 바로가기
UNITY/C#

C# interface :: 'IEnumerator'와 'IEnumerable' (자료👀)

by 램플릿 2024. 6. 25.

 



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