본문 바로가기

C# 프로그래밍/문법 개념

[C#] 반복기 메서드 (Iterator methods)

반응형

반복기란?

Foreach 같은 반복문에서 컬렉션을 단계적으로 실행할 수 있도록 도와주는 기능이다.

다시 말해, 배열과 리스트 같은 어떠한 컬렉션을 단계별로 끊어서 코드를 실행할 수 있도록 한다는 의미이다.


왜 사용하는 것인가?

반복기의 가장 큰 이유는 단계별로 실행한다는 것에 있을 것이다.

 

다음 예제를 살펴보자.

public class Sample : MonoBehaviour
{
    void Start()
    {
        foreach (object item in GetDrink())
        {
            Debug.Log(item.ToString() + " ");
            Debug.Log(" yammi!");
        }
    }

    public IEnumerable GetDrink()
    {
        Debug.Log("Start");
        int i = 0;
        while (i < 10)
        {
            Debug.Log("log cola");
            yield return DrinkType.Cola;

            Debug.Log("log sprite");
            yield return DrinkType.Sprite;

            Debug.Log("log empty");
            yield return "empty";
            i++;
        }
    }

    enum DrinkType
    {
        Cola,
        Sprite,
    }
}

 

실행결과는 다음과 같다.

로그 결과

GetDrink 함수를 실행하면 첫 번째 yield return을 만나기 전까지 모든 코드를 실행한다.

그리고 yield return의 위치를 기억했다가 다음 GetDrink 함수 실행 때 해당 위치부터 코드를 실행하는 것이다.


유니티에서 어떻게 사용할 수 있을까?

우리는 이미 코루틴을 사용하면서 반복기를 사용하고 있다.

 

코루틴에서 IEnumerator를 사용하기 때문이다.

 

이는 IEnumerator가 주는 장점들 때문인데, 가장 큰 장점으로는 yield return의 사용에 있다.

yield return 구문을 통한 제어는 비동기 제어(실제로는 비동기가 아니다)를 아주 편하게 해준다.

 

만약 5초에 한 번씩 실행하는 어떤 함수가 있다고 가정하자.

우리는 그 함수를 Update에서 실행하기 위해 timer변수와 executeTime 등의 변수를 선언한 뒤 번거롭게 if문을 사용해야 할 것이다.

가독성도 떨어지고 수정하기에도 여간 귀찮은 것이 아니다.

 

반면 코루틴으로 제작한다면 while문 안에 yield return new WaitForSeconds() 면 끝난다.

따라서 유니티에서는 이러한 비동기 형태의 처리에 있어 IEnumerator를 사용하는 것이다.

반응형

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

[C#] 추상화 (Abstraction)  (0) 2022.05.26
[C#] 이벤트 (Event)  (0) 2022.05.20
[C#] 다형성 (Polymorphism)  (0) 2022.05.08
[C#] 인터페이스 (Interface)  (0) 2022.05.05
[C#] 액션과 펑션 (Action & Func)  (0) 2022.05.05