ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Lua] 제어 구문 (if, while, repeat, for, break, goto...)
    Lua 2025. 2. 5. 11:55

    제어 구문에 해당하는 키워드들은 프로그램의 실행 흐름을 조절하는 역할을 수행합니다.

     

    이번 글에서는 Lua의 제어 구문의 기본적인 사용법에 대해 알아보도록 하겠습니다.

     

     


     

    1. if (조건문)

     

    더보기

    조건문 if는 조건식을 검사하여 해당 코드의 실행 여부를 결정합니다.

    사용법은 다음과 같습니다.

    if {state A} then
        -- code
    elseif {state B} then
        -- code
    elseif {state C} then
        -- code
    else
        -- code
    end

    각각의 if, elseif는 뒤따르는 state 조건식을 판별합니다.

    해당 조건식이 true일 경우 아래 코드가 실행됩니다.

    모든 조건식이 거짓일 경우 else의 코드가 실행됩니다.

     

    if - elseif - else 구문은 elseif, else없이 if구문만으로 존재할 수 있습니다.

    if {state} then --[[ code ]]-- end

    위와 같은 방식으로, 특정 조건식이 참일 경우에만 특정 코드가 실행되도록 구성할 수 있습니다.

     

    2. switch (조건문)

     

    switch는 주어진 표현식의 값에 따라 정해진 코드를 실행하는 구문입니다.

    하지만 Lua에는 switch 예약어가 존재하지 않습니다.

    switch대신 if 구문을 사용하거나, 아래에 소개할 방법을 사용할 수 있습니다.

     

    더보기

    이번 문단에서 소개할 방법은 StackOverflow 및 Lua wiki에 공유된 방법 중 하나입니다.

    What is the alternative for switch statement in Lua language?
    Lua users wiki : Switch Statement

     

     

    switch구문은 아래와 같이 작성될 수 있습니다.

    function switch(n, ...)
        for _,v in ipairs {...} do
            if v[1] == n or v[1] == nil then
            return v[2]()
            end
        end
    end
    
    function case(n,f)
        return {n,f}    
    end
    
    function default(f)
        return {nil,f}
    end

    해당 switch 구문은 다음과 같이 사용됩니다.

    action = "a"
    
    switch( action,
    case( 1, function() print("one")     end),
    case( 2, function() print("two")     end),
    case( 3, function() print("three")   end),
    case( "a", function() print("A") end),
    default( function() print("default") end)
    )
    
    // Output
    A

    이 외에도 여러 방법으로 swtich를 구현할 수 있습니다.

     

    하지만, 참조된 글에서는 switch를 추가로 구현하여 사용하는 것을 지양하고 있습니다.

    이유로는 if-elseif혹은 table로 구현이 가능한 것과 오히려 느릴 수 있다는 점 입니다.

     

    3. while, repeat (반복문)

     

    더보기

    while문와 repeat문은 반복문입니다.

    주어진 조건식에 따라 몸체의 코드를 반복해서 실행합니다.

    다른 언어의 while, do-while과의 관계와 유사하나, 차이점이 한 가지 존재합니다.

     

    우선 while문 입니다.

    foo = 5
    while foo > 0 do
        print(foo)
        foo = foo - 1
    end
    
    // Output
    5 4 3 2 1

    주어진 조건식인 foo가 0보다 클 경우 foo를 반복해서 출력합니다.

    몸체에 foo를 1씩 감소시키는 코드가 있어, foo가 0이 될 때 while문이 종료됩니다.

     

    다음은 repeat문 입니다.

    foo = 5
    repeat
        local bar = foo
        print(bar)
        foo = foo - 1
    until bar < 0
    
    // Output
    5 4 3 2 1 0 -1

    repeat문은 우선 몸체를 한 번 실행합니다.

    이후 until에서 주어진 조건식이 참일 경우 몸체의 반복을 종료합니다.

    while과의 차이점은 몸체의 실행과 조건식의 검사 순서가 다르다는 점 입니다.

    다른 언어의 do-while문과는 조건식이 참일 때 종료한다는 점에서 차이가 존재합니다.

    또한, until에서 사용되는 조건식은 repeat내부의 지역 변수 또한 참조할 수 있습니다.

    예제에서는 위와 같은 내용을 보여드리기 위해 로컬 변수인 bar를 추가했습니다.

     

    4. for (반복문)

     

    더보기

    for문은 수치 for문, 일반 for문으로 나누어집니다.

    수치 for문은 수치를 참조하는 반복문이고, 일반 for문은 다른 언어의 foreach문과 유사합니다.

     

    수치 for문은 다음과 같이 사용됩니다.

    for foo = 0, 10, 2 do
       print(foo)
    end
    
    // Output
    0 2 4 6 8 10

    표현식에 사용된 0, 10, 2를 각각 a, b, c로 일반화하여 표현하면 다음과 같습니다.

    수치 for문은 a를 b까지 c씩 증가시키면서 몸체 코드를 실행합니다.

    c는 생략할 수 있으며, 이 때 c는 1이 됩니다.

     

    일반 for문은 다음과 같이 사용됩니다.

    t = { 5, 1, 3, 2, 4 }
    for k, v in pairs(t) do
        print(k, v)
    end
    
    // Output
    1 5
    2 1
    3 3
    4 2
    5 4

    일반 for문은 반복자가 반환하는 모든 값에 대하여 반복합니다.

    pairs는 기본 제공 라이브러리의 함수로, 전달받은 테이블의 인덱스와 값을 반환합니다.

    위 코드에서 반환된 인덱스는 k, 값은 v에 저장되어 출력되었습니다. 

     

    5. break

     

    더보기

    break는 해당 스코프를 벗어나게 하는 예약어입니다.

    foo = 1
    while true do
        print(foo)
        foo = foo + 1
        if foo > 5 then break end
    end
    
    // Output
    1 2 3 4 5

    위 while문은 조건식이 true이기 때문에 무한 반복되지만, 몸체에 break코드가 있어 반복이 중단되었습니다. 

     

    위와 같이 반복문을 도중에 중단시키는 용도로 break를 사용합니다.

     

    6. goto

     

    더보기

    goto문은 특정 위치로 제어를 옮길 때 사용합니다.

    goto의 필요성에 관하여는 논란이 있지만 언어에 내장된 키워드이므로 소개합니다.

     

    goto는 다음과 같이 사용할 수 있습니다.

    foo = 1
    ::begin::
    print(foo)
    foo = foo + 1
    if foo < 5 then goto begin
    else goto fin end
    ::fin::
    print("Fin")
    
    // Output
    1 2 3 4 Fin

    위 코드에서 goto로 이동하는 지점이 각각 begin, fin이라고 명시되어있고, 각각 ::begin::, ::fin::으로 표현되었습니다.

    위와 같이 ::{name}:: 과 같은 표현으로 goto의 이동 지점을 지정하고, goto문으로 이동할 수 있습니다.

     


     

    Lua에서 사용되는 제어 구문을 살펴보았습니다.

     

    이번 글이 도움이 되셨기를 바랍니다.

    감사합니다.

    'Lua' 카테고리의 다른 글

    [Lua] 함수 (2)  (0) 2025.02.17
    [Lua] 함수 (1)  (0) 2025.02.13
    [Lua] 다중 할당문 (Multiple assignments)  (1) 2024.10.08
    [Lua] 연산자 알아보기  (0) 2024.10.07
    [Lua] Type (자료형) 알아보기  (0) 2024.10.04

    댓글

Designed by Tistory.