저번 장에서 함수가 무엇이고 어떻게 정의하면서 어떻게 쓰이며 독특한 특징을 알아 봤다면, 이번에는 그 독특함 중 신기한 다중 반환에 대해서 이야기 한다.

일전에 다중 배정문에 대해서 설명을 했었다. 다중 배정문이란 a, b = 1, 2 문법을 말한다. 이 다중 반환은 이 다중 배정문을 이용하여, 할당 받을 수 있게 된다.

예를 들어 string.find("hello Lua users", "Lua") 라고 했을 경우 두개의 정수를 벹어 내는데 받을 때,

s, e = string.find("hello Lua users", "Lua") 렇게 하면 된다.


그렇다면 어떻게 두개의 값을 반환시킬수 있을까?

간단하다 아래의 소스 코드처럼 하면 된다.

봤듯이 가장 기초가 되는 다중 배정문과 동일한 문법이다. 다중 함수만이 아닌, 모든 함수들은 다음과 같은 규칙을 따른다.

첫째, 함수를 문장의 형태로 썻다면, 그 반환 값을 모두 버린다.

둘째, 함수를 수식의 형태로 썻다면, 그 첫번째 반환값만 사용되고 모두 버린다.

셋째, a,b, c = two_func() ; 로 하였을 c는 nil 값이 들어 간다.


다중 반환 함수의 독특한 특징 중 한가지는 바로 함수의 인자로 함수 호출의 결과가 들어 갈 때, 다중 반환 함수의 반환값의 맨 마지막 값은, 최초 호출 하였던 함수의 매개변수가 있을 때, 대체될 수 있다.

즉 위어 처럼 1, 10 이 출력 된다.

만약 다중 반환 함수의 반환값을 잃고 싶지 않다면 다음과 같이 호출 해야 될 것이다 print( 10, two_func() ) 이렇게,

이것은 테이블 생성자에 의해서도 적용 되는데, 다중 반환 함수의 다음에 특정 값을 넣게 되면, 다중 반환 함수의 첫번째 값만 들어가게 된다.


다중 반환 함수 중에 독특한 함수가 있는데 바로 라이브러리에서 제공해 주는 unpack 함수이다. 이 함수는 table의 모든 값을 반환해 준다. print( unpack( table_name ) ) 하게 되면, 모든 값들이 출력 하게 된다.


다음 항목에선 가변 개수 인수를 받는 루아 함수를 알아 본다.


관련링크

http://www.lua.org/pil/5.1.html


총평

하나씩 정리.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요