๊ฑ ํ˜ผ์ž ๋ง‰ ์“ด ๊ฑด๋ฐ ์ฝ”๋ฃจํ‹ด ์„ธ๋ถ€์ ์ธ ๊ฑฐ ๊ถ๊ธˆํ•ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค ๋„์›€๋ ๊นŒ ์˜ฌ๋ฆผ!!!!!ย ๋ฌธ์ œ๋ฉด ์‚ญ์ œ


***


์˜ˆ์ „ Coroutine ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ๋‹ค.

Coroutine์€ IEnumerator ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ , ํ•จ์ˆ˜ Body ์— yield return ๋ฌธ์„ ํฌํ•จํ•œ ํ•จ์ˆ˜์ด๋‹ค.

๊ทธ๋ƒฅ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ (๋ฐ˜ํ™˜ ํ˜•ํƒœ void ์ธ ์• ๋“ค์ฒ˜๋Ÿผ) ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค!

๊ทธ๋Ÿผ, Coroutine์„ IEnumerator ์™€ yield return ์ด ๊ธฐ๋Šฅํ•จ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๊ฒƒ์ด ๋ฌด์—‡์ผ๊นŒ?

IEnumerator, IEnumerable, ForeachIEnumerator (I Enum er ator)

Class ๋‚ด๋ถ€์˜ Collection์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

Collection : object (๊ฐ์ฒด)๋ฅผ group์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. Array, Collection ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์œ„์˜ ์„ค๋ช…์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ ์ ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์ถ”๊ฐ€ ์„œ์ˆ  :
IEnumerator interface ๋ฅผ ๊ตฌํ˜„ํ•œ Class์˜ ๊ฒฝ์šฐ, ๊ทธ ๋‚ด๋ถ€ ๊ตฌ์„ฑ์š”์†Œ๋Š”

  • Collection (์–ด๋–ค ํƒ€์ž…์— ๊ด€ํ•œ Group - List ์ผ ์ˆ˜๋„, Array ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.)
  • Index : int ํ˜• ๋ณ€์ˆ˜. ์–ด๋–ค ์ง€์ ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๊ฐ’.
  • ์•„๋ž˜์— ์„œ์ˆ ๋œ Method ๋“ค : ์‹ค์งˆ์ ์œผ๋กœ ์ˆœํšŒ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
    ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ตฌํ˜„๋œ Class๋Š”, ํ•ด๋‹น Class ๋‚ด๋ถ€์— ๋“ค์–ด์žˆ๋Š” Collection์˜ ์ˆœํšŒ๋ฅผ ๋„๋Š” ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
public interface IEnumerator { object Current {get;} // ํ˜„์žฌ ์œ„์น˜ ๋ฐ์ดํ„ฐ (ํ˜„์žฌ ์œ„์น˜์˜ Collection ์š”์†Œ๋ฅผ return ํ•œ๋‹ค.) bool MoveNext(); // ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. void Reset(); // index๋ฅผ ์ดˆ๊ธฐ ์œ„์น˜๋กœ ์„ค์ •ํ•œ๋‹ค. }IEnumerable (I Enum er able)

Class ๋‚ด๋ถ€ Collection ์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” IEnumerator๋ฅผ ๋…ธ์ถœ์‹œํ‚จ๋‹ค.

public interface IEnumerable { IEnumrator GerEnumerator(); // ๋ง ๊ทธ๋Œ€๋กœ, IEnumerator๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. ๋ฐ˜ํ™˜ํ•˜์—ฌ, ํ•ด๋‹น interface์˜ ์ •๋ณด๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ, ํ•ด๋‹น class ๋‚ด์— ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค. }์ •๋ฆฌ ๋ฐ ํ™œ์šฉ์ •๋ฆฌ

์ฆ‰, IEnumerator๋กœ ๊ตฌํ˜„๋œ Class ๊ฐ€ ํ•ด๋‹น Class ๋‚ด๋ถ€์— ๋“ค์–ด์žˆ๋Š” Collection์˜ ์ง์ ‘์ ์ธ ์ˆœํšŒ๋ฅผ ์ฑ…์ž„์ง€๋ฉฐ.
IEnumerable ์˜ ๊ฒฝ์šฐ, IEnumerator ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณธ๋‹ค.

A Class ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.
List <'A'> ๋ฅผ Field ๋กœ์„œ ๊ฐ€์ง€๋ฉฐ, IEnumerator ๋กœ ๊ตฌํ˜„๋œ, AEnum Class ๊ฐ€ ์žˆ๋‹ค ํ•˜์ž.
AEnum Class๋Š” Field ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด AEnum ์„ Field ๋กœ์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”, IEnumerable ๋กœ ๊ตฌํ˜„๋œ, AEnumerable Class๊ฐ€ ์žˆ๋‹ค ํ•˜์ž. ํ•ด๋‹น Class ๋Š” GetEnumerator() ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๊ณ , ํ•ด๋‹น GetEnumerator() ๋Š” AEnum์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.

๋Œ€๊ฐ• ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒƒ.

ํ™œ์šฉ

IEnumerable ๋กœ ๊ตฌํ˜„๋œ, Class ๋‚ด๋ถ€์— ์ง์ ‘์ ์œผ๋กœ Collection์ด ์กด์žฌํ•˜๋ฉฐ, GetEnumerator ์—์„œ ๋ฐ˜ํ™˜ํ•ด ์ค„ ๋•Œ, IEnumerator ๋ฅผ ๊ตฌํ˜„ํ•œ Type ์„ ๋ฐ”๋กœ new ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งํฌ์˜ Person, PeopleEnum, People Class ์˜ˆ์‹œ ์ฐธ๊ณ 

๋˜ํ•œ IEnumerable ์ด ์—ฌ๋Ÿฌ IEnumerator๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

foreach

Foreach ์˜ ์‹ค์ฒด : GetEnumerator() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์—ด๊ฑฐ์ž IEnumerator ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด ๋ฐ›๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•œ๋‹ค.
์ฆ‰, ์œ„์˜ ์ •๋ฆฌ์—์„œ์˜ ์˜ˆ์‹œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด, foreach(A "๋ณ€์ˆ˜์ด๋ฆ„" in "AEnumerable type ์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜์ด๋ฆ„") ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
(์œ„์˜ A Class, AEnum Class, AEnumerable Class ๋กœ์„œ ์„œ์ˆ ํ•œ ์˜ˆ์‹œ ์ฐธ๊ณ .)

๋” ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ฉด, ์•„๋ž˜ ์ฝ”๋“œ์™€ foreach ๊ฐ€ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

IEnumerator e = AEnumerable๋ณ€์ˆ˜์ด๋ฆ„.GetEnumerator(); while(e.MoveNext()) { // Body for foreach : foreach ์•ˆ์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ๊ณผ ๋™์ผ. }yield

Microsoft ์—์„œ๋Š” yield keyword ๋ฅผ ์‹คํ–‰๋ฌธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€, yield ๊ฐ€ ์‚ฌ์šฉ๋œ ๊ทธ ํ•ด๋‹น method, operator, get Accessor ๋“ฑ์ด '๋ฐ˜๋ณต์ž(Iterator)' ์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•ด๋‹น keyword ๋ฅผ method ์—์„œ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
์ฆ‰, yield return ์„ ์‚ฌ์šฉํ•œ method ๋Š”, ์œ„์— ๋”ฐ๋ผ ๋ฐ˜๋ณต์ž๊ฐ€ ๋œ๋‹ค.

  • ๋ฐ˜๋ณต์ž๊ฐ€ ๋œ method ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ yield return ์— ๋”ฐ๋ผ ๊ตฌ์„ฑ๋œ IEnumerator ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
  • ์ด IEnumerator ๋Š” method์˜ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์š”์†Œ๊ฐ€ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. (yield return ์ด ์กด์žฌํ•˜๋Š” ๊ตฌ๊ฐ„๋งˆ๋‹ค, ๊ฐ method ์˜ body ๊ฐ€ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.) ์ด ํ•จ์ˆ˜๋“ค์˜ ๋ถ€๋ถ„๋“ค์„ IEnumerator ์—์„œ ์‚ฌ์šฉ๋˜๋Š” Collection์˜ ์š”์†Œ์ฒ˜๋Ÿผ ๋‹ค๋ฃฌ๋‹ค.
  • ๋˜ํ•œ, ๋ฐ˜๋ณต์ž๊ฐ€ ๋˜์–ด Method ์ž์ฒด์—์„œ IEnumerator ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์—์„œ, IEnumerable ๊ณผ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ๋„ ํ•˜๋‹ค. (ํ•ด๋‹น method ๋Š” IEnumerator ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ. - IEnumerable ์˜ ์—ญํ• ์ธ "IEnumerator ๋ฅผ ๋…ธ์ถœ์‹œํ‚จ๋‹ค" ๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Œ.)

Coroutine

IEnumerator ์™€ yield ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ง๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋˜ ๊ฒƒ์„ ๋ณ„๋„์˜ Thread ์ฒ˜๋Ÿผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๊ฒƒ.

์•„๋ž˜ ๋‚ด์šฉ์€ ์•Œ๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์ด๋ผ ๋ณ„๋„ ์ •๋ฆฌ ํ•„์š”์„ฑ์„ ๋ชป ๋А๊ปด ์ˆ˜๊ธฐ๋งŒ ์˜ฎ๊ธด๋‹ค.

image.png

๋ณ„๋„ ์„ค๋ช…

Coroutine ์œผ๋กœ์„œ IEnumerator ์˜ ๋ฐ˜ํ™˜ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„ method ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
์ด๋Š” ์ฆ‰, Coroutine ์„ ํ†ตํ•ด IEnumerator method ๊ฐ€ ์‹คํ–‰๋œ ๊ฒฝ์šฐ, foreach ์˜ ํ˜•ํƒœ์ฒ˜๋Ÿผ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ถ€๋ถ„๋“ค์ด ์‹คํ–‰๋˜๋‚˜, ๋ฐ˜ํ™˜ ๋ฐ›๋Š” ๊ฒƒ์— ๋”ฐ๋ผ Unity ๋‚ด๋ถ€์ , ํ˜น์€ C# ๋‚ด๋ถ€์ ์œผ๋กœ ๋งˆ๋ จ๋˜์–ด์ ธ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ex - yield return new WaitForSecond(?f); ๋“ฑ.

์ž๋ฃŒ ๋ฐ ์ถœ์ฒ˜