ienumerator란 무엇인가?

21
IEnumerator & iterator 씨씨씨 씨씨씨 씨씨씨

Upload: jungsoo-park

Post on 13-Apr-2017

1.021 views

Category:

Career


0 download

TRANSCRIPT

Page 1: IEnumerator란 무엇인가?

IEnumerator & iterator씨샵의 기묘한 반복기

Page 2: IEnumerator란 무엇인가?

IEnumerator

• 유니티에서는 코루틴을 IEnumerator 메서드로 구현

• IEnumerator 가 뭐길래 ?

• 먼저 IEnumerable 을 알아보자

Page 3: IEnumerator란 무엇인가?

IEnumerable콜렉션이 콜렉션은 foreach 구문 등에서개체를 한개한개 넘겨주는 일을 한다 .

IEnumerable

까짓거 한개씩 넘기면별거 아니겠지 ...

Page 4: IEnumerator란 무엇인가?

콜렉션을 하나하나 넘겨주려면

• 먼저 , 처음 물건을 넘겨준다• 그 다음 물건을 넘겨준다• 그 다음 물건을 ....

• 넘겨주는 쪽이 기억해야 한다

다음꺼 주세요 아 , n+1 번째 !

IEnumerable

Page 5: IEnumerator란 무엇인가?

그런데 , 받는 쪽이 여럿이면 어쩌지 ?

• 넘겨주는 쪽이 누가 몇번째까지받았는지 모두 기억할 수 있을까 ?

다음꺼 주세요

뭘 줘야 하지 ?

IEnumerable

Page 6: IEnumerator란 무엇인가?

IEnumerator 를 생성해서 해결 !다음꺼 주세요

IEnumerable

m+1 번째군요

IEnumerator

IEnumerator한개씩 써라 ..n+1 번째군요

p+1 번째군요

k+1 번째군요

Page 7: IEnumerator란 무엇인가?

IEnumerator 는 ....

• 지금 몇번째까지 읽었는지 (state) 를 기억한다• MoveNext() 를 호출받으면 다음 순번으로 이동해서• Current 를 요구할 때 해당 순번의 개체를 리턴한다

Page 8: IEnumerator란 무엇인가?

그러니까 이런 구조순서대로 받아오고 싶은 쪽이 IEnumerable 에게서 IEnumerator 를 한개씩 분양받는다

IEnumerable 은 게을러도 된다 ( 편해보인다 ...)

Page 9: IEnumerator란 무엇인가?

그런데 이게코루틴이랑 무슨 상관이죠 ?해답은 C# 의 반복기 (iterator)

Page 10: IEnumerator란 무엇인가?

반복기 (iterator)

• C# 은 코드를 멈출 수 있다• 진짜입니다• 처음보면 도저히 이해할수 없는기묘한 용법

Page 11: IEnumerator란 무엇인가?

반복기 (iterator)

• 이 메서드로 리턴받은 IEnumerable 을 foreach 로 돌려보면 3, 5, 8 을 순서대로 리턴함

• 아이에에에 닌자 ? 나제 ?

Page 12: IEnumerator란 무엇인가?

어떻게 실행되는가 ?

• IEnumerator, IEnumerable클래스는 메서드 코드를 보고컴파일러가 알아서 만들어준다 .

• IEnumerator 가 가지는state 의 초기값은 -1 이다 .

자 . 동 . 생 . 성 .

Page 13: IEnumerator란 무엇인가?

어떻게 실행되는가 ?

• 자동생성된 IEnumerator 에서MoveNext() 를 실행하면 ,yield return 3; 이전까지 실행하고state 를 0 으로 옮긴다 .

다음은 0 번 개체 ...

Page 14: IEnumerator란 무엇인가?

어떻게 실행되는가 ?

• state 가 0 일 때 Current 를 읽으면3 을 리턴한다 .

0 번 개체는 3...

Page 15: IEnumerator란 무엇인가?

어떻게 실행되는가 ?

• 그리고 MoveNext() 가 실행되면yield return 3; 이후부터yield return 5; 이전까지 실행되고state 를 1 로 옮긴다 .

다음에 오면1 번 개체를 줘야지 ...

Page 16: IEnumerator란 무엇인가?

어떻게 실행되는가 ?

• 다시 Current 를 읽어오면state 가 1 이므로 5 를 리턴한다 .

1 번 개체를 줘야지 ...

Page 17: IEnumerator란 무엇인가?

어떻게 실행되는가 ?• 그리고 MoveNext() 가

실행되면yield return 5; 이후부터yield return 8; 이전까지 실행되고state 를 2 로 옮긴다 .

• 그 다음에 Current 를 읽어오면8 을 리턴한다 .

• 다시 MoveNext() 가 실행되면콜렉션의 끝이므로 false 를 리턴 .

다음에 오면2 번 개체를 줘야지 ...

Page 18: IEnumerator란 무엇인가?

결국 컴파일러가 다 해준 거네• 컴파일러가 코드를 yield return

기준으로 나눠서 클래스를 짜줬다 !

• 덕분에 메서드가 부분부분 나뉘어서 실행되는 마술처럼 보인 것• ( 흑 ) 마술 ...?

Page 19: IEnumerator란 무엇인가?

코루틴도 이렇게 만들 수 있다 !

• IEnumerator 메서드에서 IEnumerator 가 자동생성된다 !

• 리턴된 IEnumerator 를 받아서MoveNext() 를 실행시키면코드의 앞부분이 실행된다 .

• 그리고 Current 에서 WaitForSeconds 를 리턴했다면 ?

yield return newWaitForSeconds(1);

Page 20: IEnumerator란 무엇인가?

코루틴도 이렇게 만들 수 있다 !

• Update() 에서 1 초가 지났는지매 프레임마다 확인한다• 만약 1 초가 지났다면

IEnumerator 의 MoveNext()를 호출한다• 그럼 코드의 다음 부분이 실행된다 !

시간 됐다 일해라 힝…

Update() IEnumerator

Page 21: IEnumerator란 무엇인가?

정리

IEnumerable IEnumerator 반복기