Menu
Coddy logo textTech

coroutine.yield()로 일시 중단하기

Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 54개 중 50번째.

코루틴의 진정한 강력함은 coroutine.yield() 함수에서 나옵니다. 이것은 코루틴이 실행 중간에 스스로를 일시 중단하고 자신을 재개한 코드로 제어권을 다시 넘겨줄 수 있게 해줍니다.

코루틴이 coroutine.yield()를 호출하면, 그 즉시 해당 지점에서 실행을 멈춥니다. 해당 코루틴에 대해 다시 coroutine.resume()을 호출하면, 마치 아무 일도 없었던 것처럼 yield() 호출 바로 다음 지점부터 계속 실행됩니다.

간단한 예제입니다:

function countToThree()
    print("One")
    coroutine.yield()
    print("Two")
    coroutine.yield()
    print("Three")
end

local co = coroutine.create(countToThree)
coroutine.resume(co)  -- "One"을 출력하고 일시 중단합니다
coroutine.resume(co)  -- "Two"를 출력하고 일시 중단합니다
coroutine.resume(co)  -- "Three"를 출력하고 종료합니다

resume() 호출이 yield()를 만날 때까지 코루틴을 실행하는 방식에 주목하세요. 코루틴은 모든 지역 변수와 실행 상태를 포함하여 중단된 지점을 정확히 기억합니다.

yield할 때 값을 다시 전달할 수도 있습니다. coroutine.yield()에 전달하는 모든 인수는 coroutine.resume()의 반환 값이 됩니다:

function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value)  -- 출력: 10

status, value = coroutine.resume(co)
print(value)  -- 출력: 20
challenge icon

챌린지

쉬움

count를 인자로 받아 여러 번 값을 양보(yield)하는 코루틴의 출력을 문자열로 반환하는 createYieldingCoroutine 함수를 작성하세요.

1부터 count까지 각 단계에 대해 "Step X" 문자열을 양보하고, 완료되면 "Done"을 출력하는 코루틴을 생성하세요. 모든 양보된 값과 최종 완료를 얻기 위해 코루틴을 count + 1번 재개(resume)하세요. 양보된 모든 값을 줄바꿈 문자로 연결하여 반환하세요.

로직:

  • 루프를 사용하여 "Step 1", "Step 2"부터 count까지 양보하는 함수를 만듭니다.
  • 모든 양보가 끝난 후 함수가 완료되어야 합니다 ( "Done"에 대한 최종 양보는 없음).
  • coroutine.create()를 사용하여 이 함수를 코루틴으로 감쌉니다.
  • 코루틴을 count번 재개하여 각 양보된 값을 수집합니다.
  • 양보된 모든 값을 줄바꿈 문자로 연결합니다.
  • 연결된 문자열을 반환합니다.

매개변수:

  • count (number): 양보할 단계의 수

반환값: 줄바꿈으로 구분된 모든 양보된 값을 포함하는 문자열 (string). 형식: Step 1\nStep 2\nStep 3

치트 시트

coroutine.yield() 함수는 코루틴이 실행을 일시 중단하고 호출자에게 제어권을 반환할 수 있게 합니다. coroutine.resume()이 다시 호출되면, 코루틴은 yield() 호출 직후부터 실행을 재개합니다.

coroutine.yield()의 기본 사용법:

function countToThree()
    print("One")
    coroutine.yield()
    print("Two")
    coroutine.yield()
    print("Three")
end

local co = coroutine.create(countToThree)
coroutine.resume(co)  -- "One"을 출력하고 일시 중단
coroutine.resume(co)  -- "Two"를 출력하고 일시 중단
coroutine.resume(co)  -- "Three"를 출력하고 종료

coroutine.yield()를 사용하여 값 전달하기:

function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value)  -- 출력: 10

status, value = coroutine.resume(co)
print(value)  -- 출력: 20

coroutine.yield()에 전달된 인수는 coroutine.resume()의 반환 값이 됩니다. 코루틴은 yield 사이의 모든 지역 변수와 실행 상태를 유지합니다.

직접 해보기

function createYieldingCoroutine(count)
    -- 여기에 코드를 작성하세요
end
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨