yield return, yield break
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 를 쓸때에는 반복기 인터페이스 형식이 필요하다고 나온다.
반복기 인터페이스 형식이란 것은 IEnumerable, IEnumerator 같은 인터페이스를 가르킨다.
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 자체로는 위의 정의로 끝나겠지만
이게 간단치 않다.
위의 글중에 나온 인터페이스 들...IEnumerable, IEnumerator
반복기라고 하는데 이들의 차이와 정확한 사용 예...
사용 조건을 정확히 이해 하기는 아직은 힘든 것 같다.
저 인터페이스들을 class가 implement하여 구현해서 사용 할 수도 있고
IEnumerable, IEnumerator마다 구현해야 하는 함수는
각각 다르고 foreach 말고 다른 구문에서 사용하려면 어떻게 해야 하는지 등등
계속 MSDN을 읽어 봐서 이해가 되면 다음 포스팅으로 적도록 하겠다.
'공부 > C#' 카테고리의 다른 글
C# Windows Forms - 오목 (0) | 2016.05.31 |
---|---|
소켓 통신, 웹 통신(간략 설명, 메모) (0) | 2016.05.28 |
Console 키입력 - Console.ReadKey, ConsoleKeyInfo (0) | 2016.05.12 |
예외처리 - try, catch, finally, throw new Exception (0) | 2016.05.12 |
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines (0) | 2016.05.12 |