[Lua] 함수 (1)
함수는 특정 작업, 계산을 처리하고 결과를 반환하는 일련의 과정을 추상화 한 기능입니다.
경우에 따라 프로시저, 서브루틴 등으로도 부를 수 있습니다.
루아의 함수는 다른 언어에서 사용되는 함수라는 용어와 거의 동일합니다.
인자를 전달하고, 지정된 명령을 처리하고, 결과값을 반환할 수 있습니다.
이번 글에서는 루아의 함수가 다른 언어와 다른 부분들을 살펴보도록 하겠습니다.
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개를 사용하여 받아올 수 있습니다.
예제의 주석처럼 반복문에서 하나씩 사용하는 것 또한 가능합니다.
루아에서의 함수가 다른 언어들의 함수와 다른 점을 알아보았습니다.
이번 글이 도움이 되셨기를 바랍니다.
감사합니다.