ienumerator란 무엇인가?
Post on 13-Apr-2017
1.017 Views
Preview:
TRANSCRIPT
IEnumerator & iterator씨샵의 기묘한 반복기
IEnumerator
• 유니티에서는 코루틴을 IEnumerator 메서드로 구현
• IEnumerator 가 뭐길래 ?
• 먼저 IEnumerable 을 알아보자
IEnumerable콜렉션이 콜렉션은 foreach 구문 등에서개체를 한개한개 넘겨주는 일을 한다 .
IEnumerable
까짓거 한개씩 넘기면별거 아니겠지 ...
콜렉션을 하나하나 넘겨주려면
• 먼저 , 처음 물건을 넘겨준다• 그 다음 물건을 넘겨준다• 그 다음 물건을 ....
• 넘겨주는 쪽이 기억해야 한다
다음꺼 주세요 아 , n+1 번째 !
IEnumerable
그런데 , 받는 쪽이 여럿이면 어쩌지 ?
• 넘겨주는 쪽이 누가 몇번째까지받았는지 모두 기억할 수 있을까 ?
다음꺼 주세요
뭘 줘야 하지 ?
IEnumerable
IEnumerator 를 생성해서 해결 !다음꺼 주세요
IEnumerable
m+1 번째군요
IEnumerator
IEnumerator한개씩 써라 ..n+1 번째군요
p+1 번째군요
k+1 번째군요
IEnumerator 는 ....
• 지금 몇번째까지 읽었는지 (state) 를 기억한다• MoveNext() 를 호출받으면 다음 순번으로 이동해서• Current 를 요구할 때 해당 순번의 개체를 리턴한다
그러니까 이런 구조순서대로 받아오고 싶은 쪽이 IEnumerable 에게서 IEnumerator 를 한개씩 분양받는다
IEnumerable 은 게을러도 된다 ( 편해보인다 ...)
그런데 이게코루틴이랑 무슨 상관이죠 ?해답은 C# 의 반복기 (iterator)
반복기 (iterator)
• C# 은 코드를 멈출 수 있다• 진짜입니다• 처음보면 도저히 이해할수 없는기묘한 용법
반복기 (iterator)
• 이 메서드로 리턴받은 IEnumerable 을 foreach 로 돌려보면 3, 5, 8 을 순서대로 리턴함
• 아이에에에 닌자 ? 나제 ?
어떻게 실행되는가 ?
• IEnumerator, IEnumerable클래스는 메서드 코드를 보고컴파일러가 알아서 만들어준다 .
• IEnumerator 가 가지는state 의 초기값은 -1 이다 .
자 . 동 . 생 . 성 .
어떻게 실행되는가 ?
• 자동생성된 IEnumerator 에서MoveNext() 를 실행하면 ,yield return 3; 이전까지 실행하고state 를 0 으로 옮긴다 .
다음은 0 번 개체 ...
어떻게 실행되는가 ?
• state 가 0 일 때 Current 를 읽으면3 을 리턴한다 .
0 번 개체는 3...
어떻게 실행되는가 ?
• 그리고 MoveNext() 가 실행되면yield return 3; 이후부터yield return 5; 이전까지 실행되고state 를 1 로 옮긴다 .
다음에 오면1 번 개체를 줘야지 ...
어떻게 실행되는가 ?
• 다시 Current 를 읽어오면state 가 1 이므로 5 를 리턴한다 .
1 번 개체를 줘야지 ...
어떻게 실행되는가 ?• 그리고 MoveNext() 가
실행되면yield return 5; 이후부터yield return 8; 이전까지 실행되고state 를 2 로 옮긴다 .
• 그 다음에 Current 를 읽어오면8 을 리턴한다 .
• 다시 MoveNext() 가 실행되면콜렉션의 끝이므로 false 를 리턴 .
다음에 오면2 번 개체를 줘야지 ...
결국 컴파일러가 다 해준 거네• 컴파일러가 코드를 yield return
기준으로 나눠서 클래스를 짜줬다 !
• 덕분에 메서드가 부분부분 나뉘어서 실행되는 마술처럼 보인 것• ( 흑 ) 마술 ...?
코루틴도 이렇게 만들 수 있다 !
• IEnumerator 메서드에서 IEnumerator 가 자동생성된다 !
• 리턴된 IEnumerator 를 받아서MoveNext() 를 실행시키면코드의 앞부분이 실행된다 .
• 그리고 Current 에서 WaitForSeconds 를 리턴했다면 ?
yield return newWaitForSeconds(1);
코루틴도 이렇게 만들 수 있다 !
• Update() 에서 1 초가 지났는지매 프레임마다 확인한다• 만약 1 초가 지났다면
IEnumerator 의 MoveNext()를 호출한다• 그럼 코드의 다음 부분이 실행된다 !
시간 됐다 일해라 힝…
Update() IEnumerator
정리
IEnumerable IEnumerator 반복기
top related