Lua

[Lua] 함수 (1)

ruru14 2025. 2. 13. 15:41

함수는 특정 작업, 계산을 처리하고 결과를 반환하는 일련의 과정을 추상화 한 기능입니다.

경우에 따라 프로시저, 서브루틴 등으로도 부를 수 있습니다.

루아의 함수는 다른 언어에서 사용되는 함수라는 용어와 거의 동일합니다.

인자를 전달하고, 지정된 명령을 처리하고, 결과값을 반환할 수 있습니다.

 

이번 글에서는 루아의 함수가 다른 언어와 다른 부분들을 살펴보도록 하겠습니다.

 


 

0. 함수의 형태

 

루아의 함수는 다음과 같은 형태로 구성됩니다.

// 정의
function {name}({args})
    {work}
end

// 호출
{name}({args})

예를 들어, 인자로 전달받은 값을 출력하는 함수를 다음과 같이 만들어 호출할 수 있습니다.

// 선언
function foo(arg)
    print(arg)
end

// 호출
foo("Hello world!")

 

1. 호출 간소화

 

더보기

루아 뿐만 아니라, 대부분의 언어는 함수 호출 시 인자 목록을 나타내기 위한 괄호 () 를 사용합니다.

그런데, 루아는 여기에 한 가지 예외가 있습니다.

 

만약 호출하는 함수가 인자를 하나 받고, 해당 인자가 상수 문자열 혹은 테이블 생성자일 경우 괄호를 생략할 수 있습니다.

다음과 같습니다.

// 선언
function foo(arg)
    print(arg)
end

// 호출
foo "Hello world!"

0번 문단의 예제 함수의 호출 부분에서, 괄호를 제거해도 정상적으로 작동합니다. 

 

2. 인자 갯수 조정

 

더보기

함수에 전달되는 인자는 함수가 정의될 때 지정한 갯수와 동일해야 합니다.

타입이 있는 언어의 경우, 타입 또한 동일해야 합니다.

 

하지만 루아는 모자라거나 넘치는 인자를 자동으로 조정합니다.

예제를 살펴보도록 하겠습니다.

function foo(arg1, arg2)
    print(arg1, arg2)
end

foo(1)     -- 1 nil
foo(1,2)   -- 1 2
foo(1,2,3) -- 1 2

인자를 2개 받아 출력하는 foo함수에 각각 1, 2, 3개의 인자를 넣어 호출한 경우입니다.

인자가 모자란 경우 모자란 값은 nil이 되며, 인자의 갯수보다 많은 인자는 버려집니다.

 

3. 다중 값 반환

 

더보기

루아의 함수는 여러 개의 값을 반환할 수 있습니다.

기본 제공 함수 중에서는 string.find와 같은 함수가 있습니다.

해당 함수는 다음과 같이 사용됩니다.

s, e = string.find("Hello lua world!", "lua")
print(s, e) -- 7 9

string.find함수는 첫 번째 인자에서 두 번째 인자를 찾아, 첫 인덱스와  마지막 인덱스 2개를 반환합니다.

반환되는 값은 위와 같이 다중 할당으로 한 번에 받을 수 있습니다.

 

사용자 정의 함수로 다중 값 반환을 이용하는 예제는 다음과 같습니다.

function foo (arg1, arg2)
    return arg2, arg1
end

a, b = foo(1,2)

print(a, b) -- 2 1

위 예제는 전달받은 인자를 반대 순서로 반환하는 예제입니다.

다중 값 반환은 반환문에서 위와 같이 반환 값을 나열하여 사용할 수 있습니다.

 

다중 값 반환 또한 문단 2의 인자 갯수 조정과 마찬가지로, 표현식에서 사용된 변수의 갯수에 따라 값이 nil로 설정되거나 버려지게 됩니다.

 

4. 가변 인자 함수

 

더보기

루아의 함수는 가변 인자를 받을 수 있습니다.

 

가변 인자를 사용하는 예제는 다음과 같습니다.

function foo (...)
    -- for i, v in ipairs{...} do end
    print(...)
end

foo(1,2,3,4)   -- 1 2 3 4
foo(1,2,3,4,5) -- 1 2 3 4 5

가변 인자는 점 3개를 사용합니다. 

전달받은 가변 인자는 그대로 점 3개를 사용하여 받아올 수 있습니다.

예제의 주석처럼 반복문에서 하나씩 사용하는 것 또한 가능합니다.

 


 

루아에서의 함수가 다른 언어들의 함수와 다른 점을 알아보았습니다.

 

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

감사합니다.