함수

# 학습 과정 소개

함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다.

# 메소드 소개

컴포넌트는 기본적으로 프로퍼티와 메소드로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 기본 이벤트 메소드와 사용자 지정 메소드로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때 호출되는 함수로, 호출 시점과 함수 이름이 정해져 있으며 모든 동작의 진입점이 되는 함수입니다. 사용자 지정 함수는 호출 시점이 정해져 있지 않고, 액션의 목적에 따라 이름을 자유롭게 지을 수 있습니다.

[{"index":"기본 이벤트 메소드","0":"호출 시점이 정해져 있고, 시스템 내부에서 호출다른 사용자 지정 함수에서 호출 불가.함수 이름, 리턴 타입, 매개 변수 설정 불가.게임상의 모든 액션의 시작점."},{"index":"사용자 지정 메소드","0":"함수가 정의된 목적에 따라 호출 시점 및 이름 등을 자유롭게 설정 가능.단, 시스템에서 자동으로 호출하지 않기 때문에 기본 이벤트 함수로부터 호출하여 실행."}]

> 더 알아보기 기본 이벤트 함수에 대해 더 알아보고 싶다면 아래 가이드를 참고하세요! 

# 메소드선언과 삭제

#### 메소드 선언

스크립트 에디터에서 함수를 선언할 수 있습니다. 선언 방법을 알아보기 위해 먼저 새 스크립트 컴포넌트를 생성하여 스크립트 에디터를 엽니다. [png](1687496291799b05a128af08748b8bc69f2956c9de929)   
Function 옆의 [+] 버튼을 누르면 함수 목록이 나옵니다. New를 클릭하면 사용자 지정 함수가 추가되고, 그 외 항목을 선택하면 기본 이벤트 함수가 추가됩니다. New를 클릭하여 사용자 지정 함수를 추가합니다. [png](16735978319009a6594de0ce841a687bb1bfc3de66e85)   
새로운 함수는 Function1이라는 이름으로 생성되는데, 목적에 맞게 이름을 변경할 수 있습니다. 함수의 이름을 클릭하여 텍스트 입력이 활성화되면 이름을 변경합니다. [png](163529625383210fdafccdf4d48389a20f83444d8da12)   


#### 메소드 삭제

함수명 오른쪽의 [png](16345206995612a35d54577d8466da03a9fe452a5218c) [메뉴] 버튼을 누른 뒤 Remove를 클릭해 함수를 제거합니다. [png](1637035145550329a2d443fec46c4963e19267a80fbdc)   


# 메소드 리턴 타입 설정

메이플스토리 월드의 함수는 리턴 타입을 설정해야 합니다. 기본적인 루아 문법과는 조금 다르지만, 스크립트의 내부적인 값 전달을 위해 리턴 타입은 반드시 설정해야 합니다. 함수 리턴 타입은 기본적으로 void로 설정되어 있습니다. 리턴 타입 텍스트를 클릭하면 선택 가능한 타입 목록이 나옵니다. 여기서 함수의 결과에 맞는 타입을 선택하면 해당 타입으로 변경됩니다. [png](1673598279122cc02c371fecc424e8c66e4783dc434d8)   


# 메소드 정의

해당 함수가 호출되었을 때 어떻게 동작할지를 정의할 수 있습니다. 함수명 왼쪽의 [+] 버튼을 누르면 함수 구현부가 펼쳐집니다. 구현부에 해당 함수의 기능을 코드로 작성합니다. [png](1635296282345d1313e4452014e6ca076982525e7746f)   


# 매개 변수

일반적으로 함수는 호출될 때 여러 타입의 값을 입력받을 수 있는데, 이를 위한 매개 변수도 추가할 수 있습니다. 매개 변수는 구현부 내에서 지역 변수처럼 사용하며, 초깃값은 함수가 호출될 때 할당됩니다. 만일 호출하는 곳에서 매개 변수에 아무 값도 넣지 않은 경우, nil로 넘어옵니다.

#### 매개 변수 추가

함수명 오른쪽의 [png](16345206995612a35d54577d8466da03a9fe452a5218c) [메뉴] 버튼을 누른 뒤 Add Parameter를 클릭하면 함수에 매개 변수가 추가됩니다. [png](1637035161326431e96d64ef1404a80167ba28c6518ec)   
추가된 매개 변수는 타입과 이름을 재설정 할 수 있습니다. 타입 텍스트를 클릭하면 타입 목록이 열립니다. 입력받을 매개 변수 값의 타입을 선택할 수 있습니다. [png](1673598346122b15e0c97880c46719660198439894ac4)   
매개 변수 이름을 클릭하여 텍스트 입력이 활성화되면 이름을 변경합니다. [png](1635296312284b23737fee9e14a94928f2350da9df274)   
매개 변수가 추가된 상태에서 한 번 더 추가하면, 기존 매개 변수 우측에 새 매개 변수가 생성됩니다. [png](16370352064875922d8bb2fcd41088e3bb33edde931ed)

#### 매개 변수 삭제

추가한 매개 변수를 삭제할 수 있습니다. 메소드명 오른쪽의 [png](16345206995612a35d54577d8466da03a9fe452a5218c) [메뉴] 버튼을 누른 뒤 Remove Parameter를 클릭하면 매개 변수가 삭제됩니다. [png](1637035223229386a07a202b04ebf99b8bbe5d31070bb)   
만일 매개 변수가 2개 이상 있었다면, 오른쪽 매개 변수부터 차례로 삭제됩니다. [png](1637035232985d47aef4485fe42a29adeaa73f8a09678)   


# 메소드 호출

메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 컴포넌트 객체(또는 서비스):메소드명(매개 변수) 형식으로 호출합니다.

#### 동일한 컴포넌트 내 메소드 호출 시

동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 self:메소드명(매개 변수) 형식으로 호출합니다. (self는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.)
    
    
    @Component
    script MethodCallDemo extends Component
        method void OnBeginPlay()
        local param = "MethodCallTest"
        self:MethodPractice(param)          -- self:메소드명(매개 변수)으로 메소드 호출
        end
    
        method void MethodPractice(string parameter)
        log(parameter)                     -- 콘솔 창에 "MethodCallTest" 출력
        end
    end
    

#### 다른 컴포넌트, 또는 서비스의 메소드 호출 시

다른 컴포넌트의 메소드를 호출할 때에는 컴포넌트 객체:메소드명() 형식으로 호출합니다. 다른 컴포넌트 객체는 일반적으로 해당 컴포넌트를 포함하고 있는 엔티티를 통해 참조할 수 있습니다. 서비스도 마찬가지로 서비스명:메소드명() 형식으로 호출합니다. 아래 스크립트를 테스트하기 위해 TestComponent를 추가하고, map01에 Add component를 사용하여 연결합니다.
    
    
    @Component
    script MapComponentInvoker extends Component
        method void OnBeginPlay()
        local param = "MethodCallTest" 
        local mapEntity = _EntityService:GetEntityByPath("/maps/map01")     -- 서비스의 메소드 호출 시
        local componentInstance = mapEntity.TestComponent                   -- 다른 컴포넌트 객체 참조
        componentInstance:MethodCallTest(param)                             -- 컴포넌트 객체의 메소드 호출
        end
    end
    

#### 메소드 호출 형식 예외

루아 스크립트에서 제공하는 일부 메소드 또는 일부 타입에서 제공하는 Static 메소드의 경우에는 :이 아닌 .으로 호출합니다.
    
    
    @Component
    script ApiUsageExample extends Component
        method void OnBeginPlay()
        --루아 함수 사용 예시
        local tmpTable = {1,2,3,4,5}
        table.insert(tmpTable, 6)                   -- :이 아닌 .으로 함수 호출
        local len = string.len("Method Practice")     -- :이 아닌 .으로 함수 호출
    
        log(#tmpTable)                              -- 콘솔 창에 6 출력
        log(len)                                   -- 콘솔 창에 15 출력
    
        --Vector2 타입의 Static 함수 사용 예시
        local positionA = Vector2(0,0)
        local positionB = Vector2(10,10)
        local distance = Vector2.Distance(positionA, positionB)  -- :이 아닌 .으로 함수 호출
        log(distance)                                       -- 콘솔 창에 positionA와 positionB의 거리 출력
        end
    end