midas+son의 크리에이티브(creative) 이야기

C#에 들어와서 첨 보는 구문이다.

지금껏 뭔가 만들 때는 쓸 일이 없었는데

유니티의 코루틴 관련되어서는 쓸일이 많다는 것 같다.


유니티의 코루틴은 나중에 다뤄서 보고 

오늘은 C#의 yield가 붙은 구문에 대해서 살펴 보자.


C#에 대한 자세한 사항은 역시 MSDN이다.

아래의 url에 들어가서 한번 씩 살펴 보자

https://msdn.microsoft.com/ko-kr/library/9k7k7cf0.aspx


본인이 머리속으로 정리한 내용은 이러하다.


어떠한 함수 내에서 return 값을 받는 것이 있다고 해보자.

그 return은 반복문 안에 있다.


예를 들면 아래와 같다.

int 함수명()

{

int count = 0;

while(true)

{

count += 1;

return count;

}

}


위의 함수를 호출 해봤자 계속 return값은 1 밖에 안된다.


그렇다면 이제 yield return 을 사용해 보자.


yield 를 쓸때에는 반복기 인터페이스 형식이 필요하다고 나온다.

반복기 인터페이스 형식이란 것은 IEnumerableIEnumerator 같은 인터페이스를 가르킨다.


        private IEnumerable<int> Count()

        {

            int count = 0;

            while (true)

            {

                count += 1;

                yield return count;

            }

        }


        public void Print()

        {

            foreach (int i in Count())

            {

                Console.WriteLine(i);

            }

        }


위와 같은 소스가 정~~~말 간략한 예제이다.

(찾아보면 정말 어렵게 잘쓴 코드들이 있다. 전문적인....)


Print()함수 호출하게 되면 1부터 계속 1씩 증가된 값들이 출력된다.

while (true) 이므로 1,2,3,4,5,6,~,~,~,,,,계속 출력 된다.


어떻게 1이 아니라 값이 증가가 되는 것일까?

yield return 으로 빠져 나온 구문은 현재 그 상태를 기억하고 있다.

말이 좀 애매한데

foreach  에서 계속 반복으로  Count()를 호출하고 변수 i에 넣고

Console.WriteLine(i); 를 끝나고 다시 체크 할때

Count() 의 처음 부터 다시 동작 하는 것이 아니라

yield return 을 했던 자리에서 다시 시작 되는 것이다.


즉 함수가 아예 끝... } 부분까지 도달하지 않는 이상 계속 돌리는 것이다.

위와 같은 예제 소스에서는 While( 조건문 )에 반복을 나올 수 있는 조건을 주거나

while(true){

 ....

 if (count == 8) yield break

....}

와 같이 yield break; 을 해주면 해당 반복을 모두 마칠 수 있다.


yield return 을 한 문장으로 정리하자면

리턴되는 위치가 저장되어 다시 호출 됐을 때 저장된 위치로부터 재시작이 될수 있다.

라고 생각 해도 되겠다.

그 것을 끝낼 수 있는 것은 yield return 할수 없이 함수 자체가 끝나거나 

강제로  yield break; 해주면 된다.


yield 자체로는 위의 정의로 끝나겠지만

이게 간단치 않다.

위의 글중에 나온 인터페이스 들...IEnumerableIEnumerator

반복기라고 하는데 이들의 차이와 정확한 사용 예...


사용 조건을 정확히 이해 하기는 아직은 힘든 것 같다.


저 인터페이스들을 class가 implement하여 구현해서 사용 할 수도 있고

IEnumerableIEnumerator마다 구현해야 하는 함수는 

각각 다르고 foreach 말고 다른 구문에서 사용하려면 어떻게 해야 하는지 등등

계속 MSDN을 읽어 봐서 이해가 되면 다음 포스팅으로 적도록 하겠다.