메이플스토리 월드 루아 구문

# 학습 과정 소개

메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다.

# 조건문

보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다.   
먼저 조건문을 살펴봅시다.

  * if
    * 기본 조건문입니다. 조건이 true 면 then과 end 사이의 내용을 실행합니다.
  * elseif
    * if에 추가적으로 붙는 조건문입니다. 기본 if 문이 있어야 사용할 수 있습니다.
    * if의 조건이 false 면 elseif의 조건을 확인합니다.
    * elseif는 필수적인 요소는 아닙니다.
  * else
    * 기본 if 문이 있어야 사용할 수 있습니다.
    * if, elseif의 조건이 false 면 else의 내용을 실행합니다.
    * else는 필수적인 요소는 아닙니다.

  
예제를 살펴봅시다. ```lua @Component script NumberRangeLogger extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() local a = 7 
    
    
    -- if 조건 then 실행 내용 end
    if a > 10 then
        log("big")
    
    -- elseif 조건 then 실행 내용
    elseif a > 5 then
        log("middle")
    
    -- else 실행 내용
    else
        log("little")
    end
    end
    

end
    
    
    위 조건문을 살펴보면 아래와 같이 조건이 설정되어 있습니다.
    * a가 10보다 크면 **big**을 출력
    * a가 10보다는 작지만 5보다 크면 **middle**을 출력
    * 그 외의 경우라면(즉, a가 5보다 작다면) **little**을 출력
    
    a는 7이므로 위 내용을 실행하면 **middle**이 출력됩니다.
    
    # 반복문
    
    루아에서 자주 사용하는 반복문의 형태를 살펴봅시다.
    
    ## while 문
    **while 문**은 조건식을 먼저 평가하고 조건이 **false** 또는 **nil** 이면 반복이 끝납니다. 조건이 **true** 면 반복 코드를 실행합니다.
    예제를 살펴봅시다.
    
    

@Component script NumberSequenceLogger extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() \-- while 조건 do 반복할 내용 end
    
    
        
        local a = 10
        
        while(a <= 15)
        do
            log(a)
            a = a + 2
        end
        
        --[[결과:
        10
        12
        14
        ]]
    end
    

end
    
    
    ## repeat 문
    **repeat - until 반복문**은 조건이 참이 될 때까지 반복하는 구문입니다. 코드 블록이 실행되어야 조건부가 참인지 확인할 수 있으므로 코드 블록은 최소 1번 이상 실행됩니다. 
    예제를 살펴봅시다.
    

@Component script SimpleCountdown extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() local countdown = 5
    
    
        
        repeat
            countdown = countdown - 1
            log(countdown)
        until countdown == 0
        
        log("The countdown is over.")
        
        --[[결과:
        4
        3
        2
        1
        0
        -- The countdown is over.
        ]]
    end
    

end
    
    
    ## for 문
    **for 문**은 숫자 또는 항목의 개수를 기반으로 반복 탐색하는 구문입니다.
    
    ### 수치 for 문 (Numeric For Loops)
     **수치 for 문**에서는 초깃값, 최종값, 증감값을 정의합니다. 초깃값에서 최종값이 될 때까지 증감값을 넣어 반복 계산합니다.
    
    예제를 살펴봅시다.
    

@Component script ForLoopExample extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() \-- for 변수 = 초깃값, 최종값, 증감값 do end \-- 증가값이 1인 경우에는 1을 생략해도 됩니다.
    
    
        
        for i = 10, 15
        do
            log(i)
        end
        
        --[[결과:
        10
        11
        12
        13
        14
        15
        ]]
        
        for i = 20, 10, -2
        do
            log(i)
        end
        
        --[[결과:
        20
        18
        16
        14
        12
        10
        ]]
    end
    

end
    
    
    
    ### 일반 for 문 (Generic For Loops)
    **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다.
    일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다.
    일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다.
    
    #### 배열(Array)
    `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 
    예제를 살펴봅시다.
    

@Component script TestArrayLogger extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() local testArray = {"A", "B", "C", "D", "E"} for index, value in ipairs(testArray) do log(index, value) end
    
    
        
        --[[결과:
        1 A
        2 B
        3 C
        4 D
        5 E
        ]]
    end
    

end
    
    
    #### 사전(Dictionary)
    `pairs()`는 사전의 **key - value**를 반복해서 반환합니다. 사전의 반환 순서는 내부적으로 정해지는 것이기에 크리에이터가 작성한 순서가 보장되지 않는다는 점을 기억합시다.
    예제를 살펴보겠습니다.
    

@Component script TestDataLogger extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() local testdictionary = {name = "Tom", age = 20, favoriteGame = "MapleStory Worlds", job = "Programmer"}
    
    
        
        for key, value in pairs(testdictionary) do
            print(key, value)
        end
        
        --[[결과:
        favoriteGame MapleStory Worlds
        name Tom
        job Programmer
        age 20
        ]]
    end
    

end
    
    
    ## 반복 종료
    반복을 종료할 때는 `break` 명령을 사용합니다. 
    무한 반복을 종료하는 예제를 살펴봅시다.
    

@Component script MapTransitionTimer extends Component @ExecSpace("ServerOnly") method void OnBeginPlay() local secondsElapsed = 0 local timeout = 5
    
    
        
        while true do
        	log(secondsElapsed.."초")
        	wait(1)
        	secondsElapsed = secondsElapsed + 1
        
        	if secondsElapsed == timeout then
        		break
        	end
        end
        
        log("5초가 지났습니다. 다음 맵으로 이동합니다.")
        
        --[[결과:
        0초
        1초
        2초
        3초
        4초
        5초가 지났습니다. 다음 맵으로 이동합니다.
        ]]
    end
    

end