메이플스토리 월드 루아 문법 확장

# 학습 과정 소개

메이플스토리 월드에서는 루아에서 기본적으로 지원하지 않지만 다른 프로그래밍 언어에서 유용하게 사용되는 문법을 확장하여 지원합니다. 본 과정에서는 메이플스토리 월드에서 지원하는 루아 확장 문법 및 사용 예시를 소개합니다.

# Continue

continue는 해당 루프 사이클에 남아 있는 나머지 명령어를 건너뛰고 다음 단계의 루프를 수행하도록 하는 키워드입니다.
    
    
    @Component
    script OddNumberCollector extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local oddNumbers = {}
            for i = 1, 10 do
                if i % 2 == 0 then
                    continue -- 짝수는 이후 작업을 하지 않음
                end
                print("odd number : ", i)
                table.insert(oddNumbers, i)
            end
            -- Output :
            -- odd number : 1
            -- odd number : 3
            -- odd number : 5
            -- odd number : 7
            -- odd number : 9
        end
    end
    

# 복합 할당 연산자

복합 할당 연산자(Compound assignment operators)란 연산과 할당을 동시에 할 수 있는 연산자입니다.

#### 더하기 할당 연산자

더하기 할당 연산자(Addition assignment operator) `+=`는 더하기 연산 결과를 할당합니다.
    
    
    @Component
    script PositionUpdater extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            self.Entity.TransformComponent.Position.x = self.Entity.TransformComponent.Position.x + 0.1 -- Position의 x값을 0.1 증가시킴
            local num = 1
            num = num + 2 -- num에 2를 더한 값을 할당함
            print(num)
            -- Output :
            -- 3
        end
    end
    

#### 빼기 할당 연산자

빼기 할당 연산자(Subtraction assignment operator) `-=`는 빼기 연산 결과를 할당합니다.
    
    
    @Component
    script XPositionOffset extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            self.Entity.TransformComponent.Position.x = self.Entity.TransformComponent.Position.x - 0.1 -- Position의 x값을 0.1 감소시킴
            local num = 1
            num = num - 2 -- num에 2를 뺀 값을 할당함
            print(num)
            -- Output :
            -- -1
        end
    end
    

#### 곱하기 할당 연산자

곱하기 할당 연산자(Multiplication assignment operator) `*=`는 곱하기 연산 결과를 할당합니다.
    
    
    @Component
    script BasicMathOutput extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local num = 2
            num *= 3 -- num에 3을 곱한 값을 할당함
            print(num)
            -- Output :
            -- 6
        end
    end
    

#### 나누기 할당 연산자

나누기 할당 연산자(Division assignment operator) `/=`는 나누기 연산 결과를 할당합니다.
    
    
    @Component
    script DivisionOutput extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local num = 5
            num /= 2 -- num을 2로 나눈 값을 num에 할당함
            print(num)
            -- Output :
            -- 2.5
        end
    end
    

#### 정수 나누기 할당 연산자

정수 나누기 할당 연산자(Floor Division assignment operator) `//=`는 나누기 연산을 수행한 후 몫을 할당합니다.
    
    
    @Component
    script FloorDivider extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local num = 5
            num //= 2 -- num을 2로 나눈 몫을 num에 할당함
            print(num)
            -- Output :
            -- 2
        end
    end
    

#### 나머지 할당 연산자

나머지 할당 연산자(Remainder assignment operator) `%=`는 나누기 연산을 수행한 후 나머지를 할당합니다.
    
    
    @Component
    script RemainderCalculator extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local num = 5
            num %= 2 -- num을 2로 나눈 나머지를 num에 할당함
            print(num)
            -- Output :
            -- 1
        end
    end
    

#### 거듭 제곱 할당 연산자

거듭 제곱 할당 연산자(Exponentiation assignment operator) `^=`는 거듭 제곱 연산 결과를 할당합니다.
    
    
    @Component
    script NumberSquarer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local num = 5
            num ^= 2 -- num의 제곱을 num에 할당함
            print(num)
            -- Output :
            -- 25.0
        end
    end
    

#### 문자열 이어 붙이기 할당 연산자

문자열 이어 붙이기 할당 연산자(String concatenation assignment operator) `..=`는 문자열을 이어 붙인 결과를 할당합니다.
    
    
    @Component
    script StartupMessage extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local str = 'Hello, '
            str ..= 'MapleStory '
            str ..= 'World!'
            print(str)
            -- Output :
            -- Hello, MapleStory World!
        end
    end
    

#### 왼쪽 비트 시프트 할당 연산자

비트 시프트는 프로그래밍에서 사용되는 비트 연산자 중 하나로, 이진수 값을 왼쪽이나 오른쪽으로 이동시킵니다. 왼쪽 비트 시프트 `<<`는 이진수를 왼쪽으로 이동시키며 오른쪽에는 0을 추가합니다. 왼쪽 비트 시프트 할당 연산자(Bitwise left shift assignment operator) `<<=`는 비트를 왼쪽으로 이동한 결과를 할당합니다.
    
    
    @Component
    script LeftBitShifter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local num = 2    -- 0b0010
            
            -- 0b는 해당 숫자가 이진수임을 나타내는 표기법
            -- num의 이진수를 왼쪽으로 1만큼 이동시킴
            num <<= 1       -- 0b0100
            print(num)
            -- Output :
            -- 4
        end
    end
    

#### 오른쪽 비트 시프트 할당 연산자

오른쪽 비트 시프트 할당 연산자(Bitwise right shift assignment operator) `>>=`는 비트를 오른쪽으로 이동한 결과를 할당합니다.
    
    
    @Component
    script RightBitShift extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local  num = 2   -- 0b0010
            
            -- num의 이진수를 오른쪽으로 1만큼 이동시킴
            num >>= 1        -- 0b0001
            print(num)
            -- Output :
            -- 1
        end
    end
    

#### 비트 AND 할당 연산자와 비트 OR 할당 연산자

비트 AND 연산자(Bitwise AND operator) `&`는 두 개의 값을 비교하여 같은 위치의 비트가 모두 1이면 결과로 1을 반환하고, 그렇지 않으면 0을 반환합니다. 반면, 비트 OR 연산자(Bitwise OR operator) `|`는 두 개의 값을 비교하여 같은 위치의 비트 중 하나라도 1이면 결과로 1을 반환하고, 그렇지 않으면 0을 반환합니다. 예를 들어 봅시다.
    
    
    @Component
    script BitwiseOperations extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local a = 10 -- 이진수 1010
            local b = 7 -- 이진수 0111
            
            local result = a & b -- 비트 AND 연산 수행
            print(result)
            -- Output : 
            -- 2 (이진수 0010)
            
            local result = a | b -- 비트 OR 연산 수행
            print(result)
            -- Output : 
            -- 15 (이진수 1111)
        end
    end
    

비트 AND 할당 연산자(Bitwise AND assignment operator) `&=`는 비트 AND 연산을 수행한 후 그 결과를 할당합니다. 비트 OR 할당 연산자(Bitwise OR assignment operator) `|=`는 비트 OR 연산을 수행한 후 그 결과를 할당합니다. 사용 예시를 살펴봅시다.
    
    
    @Component
    script CardKeywordManager extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local cardKeywords =
            {
                Taunt = 1 << 0,
                BattleCry = 1 << 1,
                Deathrattle = 1 << 2,
                Windfury = 1 << 3,
                Immune = 1 << 4,
            }
            
            local function HasKeyword(card, keyword)
                return (card & keyword) == keyword
            end
            
            local newCard = cardKeywords.Taunt | cardKeywords.BattleCry
            print("Taunt : ",HasKeyword(newCard, cardKeywords.Taunt))
            -- Output :
            -- Taunt : true
            
            newCard &= ~cardKeywords.Taunt -- newCard에서 Taunt 제거
            print("Taunt : ",HasKeyword(newCard, cardKeywords.Taunt))
            -- Output :
            -- Taunt : false
            
            newCard |= cardKeywords.Immune -- newCard에 Immune 추가
            print("Immune : ",HasKeyword(newCard, cardKeywords.Immune))
            -- Output :
            -- Immune : true
        end
    end
    

  
> **더 알아보기** > 복합 할당 연산자를 사용할 때 지원하지 않는 기능도 있습니다. > 먼저, 다중으로 복합 할당을 할 수 없습니다. > ```lua @Component script UniqueLogic extends Component end ``` 

> 또한 복합 할당을 인수(argument)로 사용할 수 없습니다.


@Component script BaseScript extends Component end
    
    
    >