'프로그래밍 > 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
IEnumerator와 IEnumerable 사용법  (0) 2017.09.15

유니티를 개발하게 되면서 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