0. 들어가며....
지금 글을 쓰는 시점은 추석전인데 아마 글이 다완성 되면 추석이 지난 10월 초쯤일거라는 생각이 듭니다. 개인적으로 이세상에서 가장존경하는 분이 아버지라는 분이 계시는데 전 그분이 세상에서 제일 부럽기도 하고 동시에 잘이해가지 않는 것도 사실입니다. 웬지 저와는 다른 세계인거같기도 하고요.
아버지와 전 지지하는 대선 후보부터 극과극으로 다름니다.
한마디로 불행한거지요.
그렇지만...올해는 정말 아버지를 존경하고 싶습니다.
추석을 맞이하여 때론...
남남은 return처럼 쿨할수있지만..
혈육은 yield와 같다는 생각을 해보며 강좌를 시작 해보겠습니다.
1. yield 문법
yield [coroutine | YieldInstruction]
위와 같이 코루틴 또는 yield명령어가 오거나 또는 아무것도 오지않을수있습니다.
기본적으로 yield문이 오면 그위치부터 실행이 일단 보류됩니다. 그 다음에 뒤에오는 명령어또는 코루틴이 종료가될때까지 다음으로 진행하지 않습니다.
해당 자바스크립트에서만 실행이보류되고 다른 자바스크립트로 실행이 넘어 가는것입니다. (만약 해당 자바스크립트내에서 최상위 함수였다면)
이것은 멀티쓰레드에서 비선점형 방식으로 스케쥴링하는것과 비슷합니다.
그래서 당연히 뒤에 아무것도 없다면 그 부분에서 단순히 실행만 보류되고 바로 호출한 윗단계 함수로 실행이 넘어가게됩니다.
foo1 foo2 라는 코루틴을 차례로 호출해본 예입니다. 이것을 실행 시키면 결과는 다음과 같습니다.
여기서 만약 28번째 라인의 foo1()을
yield foo1(); 으로 수정해주면 결과 값은 아래와 같이 바뀌게 됩니다.
앞에써준 yield 때문에 foo1이 완전히 끝날때 까지 기다렸다가 foo2가 실행됩니다. 그렇지만 foo1이 끝날때까지 기다린다고해서 실행전체가 블러킹이 되는것이 아닙니다.
2. return 과 yield
코루틴을 실행할때 앞에 yield가 붙는것과 붙지않는것의 차이점은 다음과 같습니다.
yield가 앞에 붙으면...
코루틴이 호출되기 전에 실행이 보류되며 해당코루틴이 완전히 종료될때까지 그 다음 라인으로 진행하지않는다. 코루틴내에서 실행보류가 일어나더라도 호출한 함수측에서 그 다음 라인으로 진행은 하지않는다.
그냥 코루틴만 호출되면..
코루틴이 실행보류 상태가 되고 호출한 측으로 돌아와서 그 다음 라인의 실행이 재개된다. 그다음 프레임에 다시 보류된 라인부터 실행이 재개된다.
여기서 얻을수 있는 결론은 코루틴내에서 yield는 마치 리턴문처럼 실행 흐름이 호출한 측으로 다시 되돌아가지만, 리턴문처럼 해당 코루틴의 실행을 종료하지않고 그부분부터 다시 실행을 재개할수있다는 점이 리턴문과는 다르다는것을 알 수 있습니다.
이부분이 좀 많이 헷깔릴수도 있는 부분이라서 익숙하게 다루기 위해서는 연습이 많이 필요한 부분입니다.
yield 와 return을 닮을 꼴로 보시고 return은 완전히 쫑난거고 yield는 먼가 미련이 남은 상태라고 보시면됩니다. 예를 들면 여친과 헤어졌는데 쿨하지못하게 연락처를 남겨놓앗다면 이것은 yield가되는것이죠.
또하나의 예를 헤어진 여친의 명품백 선물의 카드할부값이 아직 남아 있는상태라고 보셔도 무방합니다.
return은 일시불이고요.
3. 결론
yield가 컨택스트 스위칭을 해주는것은 아닙니다. 다만 좀 비슷할뿐입니다. 예전 영화중에 좋은놈 나쁜놈 이상한놈이라는 영화가 있었는데 좀 그런 어정쩡한 개념일수도있습니다. 유니티에서 우리가 생각하는 컨택스트 스위칭 비슷한 일이 일어나는시점은 자바스크립트내에서 최상위 코루틴에서 yield가 나올때입니다. 단 예외로 update에는 yield문의 사용이 금지됩니다.
'프로그래밍' 카테고리의 다른 글
[KGC12] Forward / Deferred Rendering 발표자료 (1) | 2012.10.12 |
---|---|
Data Oriented Design 그 후... (2) | 2012.10.07 |
네트워크 게임 튜터리얼 2기 - 2화 월드 세우기 (9) | 2012.09.27 |
유니티엔진의 coroutine & yield 2편 (7) | 2012.09.25 |
네트워크 게임 튜터리얼 2기 - 컨텐츠편 1화 (10) | 2012.09.17 |