유니티를 개발하게 되면서 IEnumerator와 IEnumerable에 대해 공부하게되었다.


간단하게 요약하자면 Custom한 state를 만들어 while이나 foreach문으로 편리하게 쓰거나 Coroutine으로 사용하는

Interface의 일종  


IEnumerator가 가지는 state의 초기값은 -1이다.



사용하는 방법을 코드로 풀어보면

 
    private int[] data = { 5, 4, 3, 2, 1 };

    public IEnumerator GetEnumerator()
    {
        int i = 0;
        while (i < data.Length)
        {
            Debug.Log(data[i]);    //MoveNext.했을때 진행이 끝나는 지점.
            yield return data[i];    //Current에 접근했을때 진행이 끝나는 지점
            ++i;
        }
    }

    private void Start()
    {
        IEnumerator it = data.GetEnumerator();

        it.MoveNext(); // 내부적인 state가 이때 -1에서 0이 된다.
        Debug.Log(it.Current);    // data[i]의(i = 0) 값인 5가 리턴되어 나오고
        it.MoveNext();
        Debug.Log(it.Current);    // data[i]의(i = 1) 값인 4이 리턴되어 나오고
        it.MoveNext();
        Debug.Log(it.Current);    // data[i]의(i = 2) 값인 3이 리턴되어 나온다
    }


C#에서 list들은

IEnumerator를 원래 가지고있어

(int[] dat = { 1, 2, 3, 4, 5 };

dat.GetEnumerator(); //이렇게 나온다)


IEnumerator를 만들어 주지 않아도 된다.(위의 GetEnumerator는 대충 어떻게 동작하는지 보여주기 위한 구현)


IEnumerator를 사용하는 반복문의 2가지 예

 
private int[] data = { 5, 4, 3, 2, 1 };

//예_1
IEnumerator it = data.GetEnumerator();
while(it.MoveNext())
{
    Debug.Log(it.Current);
}

//예_2
foreach(var num in data)
{
    Debug.Log(num);
}


그리고 IEnumerable 이라고


public IEnumerable<int> GetNumber()

    {

        int i = 0;

        while (i < data.Length)

        {

            yield return data[i];

            ++i;

        }

    }

해서

foreach (int num in GetNumber())

{

    Debug.Log(num);

}

이렇게 쓰는 방법도 있다.


다시 돌아와서 IEnumerator를 코루틴으로 돌리면

StartCoroutine(GetEnumerator());//이렇게 하면 되고 이때 쓰는 GetEnumerator()는 만들어 줘야함

물론  StartCoroutine(data.GetEnumerator());//이렇게 쓰면 안만들어줘도 된다.


하지만 커스텀 하고싶으면 위의 GetEnumerator()처럼

IEnumerator 만들어서 입맛대로 yield return 해줘야 된다.

'프로그래밍 > C#' 카테고리의 다른 글

return default(T);란?  (0) 2018.08.02
C# string 사용법  (0) 2018.06.27
C# const, readonly 차이  (0) 2018.06.04
C# 문법 참고 사이트  (0) 2018.06.01
C# 자료구조별 속도  (0) 2018.03.20

+ Recent posts