Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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을 ...
결국 컴파일러가 다 해준 거네
• 컴파일러가 코드를 yield return
기준으로 나눠서 클래스를 짜줬
다!
• 덕분에 메서드가 부분부분 나뉘
어서 실행되는 마술처럼 보인
것
• (흑)마술...?
코루틴도 이렇게 만들 수 있다!
• IEnumerator 메서드에서
IEnumerator가 자동생성된다!
• 리턴된 IEnumerator를 받아서
MoveNext()를 실행시키면
코드의 앞부분이 실행된다.
• 그리고 C...
코루틴도 이렇게 만들 수 있다!
• Update() 에서 1초가 지났는지
매 프레임마다 확인한다
• 만약 1초가 지났다면
IEnumerator의 MoveNext()
를 호출한다
• 그럼 코드의 다음 부분이 실행
된다!
...
정리
IEnumerable IEnumerator 반복기
Upcoming SlideShare
Loading in …5
×

IEnumerator란 무엇인가?

유니티3D를 공부하면서 IEnumerator가 무엇인지 공부한 내용입니다.

  • Login to see the comments

IEnumerator란 무엇인가?

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

×