Unity

[Unity] 열거자 인터페이스 (IEnumerator)

Honey Badger 2023. 5. 13. 19:49

이게 뭔데?

   유니티 개발을 하면서 한번쯤은 다들 코루틴에 대해 접해보았을 것이라 생각한다. 코루틴을 사용하기 위해 StartCoroutine 함수를 사용할 때 인자로 넘겨주는 값이 바로 이 열거자 인터페이스이다. Current, MoveNext(), Reset()을 포함하였을 때 인터페이스를 사용할 수 있다. 

 private Coroutine shopOpen = null; // 코루틴 선언.
 shopOpen = StartCoroutine(ShopOpen()); //코루틴 정의.
 IEnumerator ShopOpen(){...}; // 열거자 인터페이스.

 

 

무슨 기능을 하는데?

  유니티에서 IEnumerator은 작업을 분할하여 수행하는 함수라고 생각하면 편하다. 

IEnumerator GetNumberIEnumerator()
    {
        Debug.Log("IEnumerator : " + 1);
        yield return 1;
        Debug.Log("IEnumerator : " + 2);
        yield return 2;
        Debug.Log("IEnumerator : " + 3);
        yield return 3;
    }

열거자 인터페이스는 항상 yield return과 함께 쓰이는데 함수를 이처럼 반환하는 것은 함수를 완전히 끝내는 것이 아니라 자신이 실행하고 있던 상태를 기억하고 있다가 다음번 호출때 기억한 시점부터 다시 코드를 실행하도록 한다. 다른 말로 하면 열거자를 사용하면 일시적으로 CPU의 권한을 다른 함수에 위임한다는 뜻이다. 

 

 

 

 

어떻게 사용하는 건데?

 void PrintNumber()
    {
        IEnumerator getNumberIEnumerator = GetNumberIEnumerator();
        getNumberIEnumerator.MoveNext();
        Debug.Log(getNumberIEnumerator.Current);
        getNumberIEnumerator.MoveNext();
        Debug.Log(getNumberIEnumerator.Current);
        getNumberIEnumerator.MoveNext();
        Debug.Log(getNumberIEnumerator.Current);
    }

열거자를 호출하여 사용하는 코드는 위와 같은데 우선 열거자 객체를 정의한 후, 열거자에 내장된 MoveNext()함수를 호출하여 열거자에 CPU 권한을 위임하고, 열거자는 yield return으로 CPU에 다시 권한을 넘기기 전까지 코드를 실행한다. 

 

그렇다면 MoveNext()를 사용해 마지막 return까지 도달했을 때 MoveNext()를 또 호출하면 처음으로 돌아갈까? 아니다. 따라서 Current를 시작점으로 옮기고 싶다면 getYourIEnumerator.Reset() 함수를 호출해야 한다. 

 

 

 

 

열거자의 또다른 활용법 IEnumerable

커스텀 클래스를 열거하는 데 사용할 수 있다. IEnumerator은 열거자 그 자체이고, IEnumerable은 특정 객체가 열거될 수 있게만들어준다. 따라서 IEnumerable 클래스를 상속받기만 하면 된다. 이 방법으로 foreach와 같은 반복문을 직접 사용할 수 없는 객체를 가능하게 만들어 줄 수 있다. 자세한 방법은 다음 블로그를 참고하자.

https://velog.io/@cedongne/Unity-%EC%97%B4%EA%B1%B0%EC%9E%90-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-IEnumerator

'Unity' 카테고리의 다른 글

[Unity] 코루틴이란?  (0) 2023.05.13
[C#] 프로퍼티란 무엇인가?  (0) 2023.05.13