가변 인자 함수 (...)
Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 54개 중 11번째.
때때로 임의의 개수의 인수를 처리할 수 있는 함수가 필요할 때가 있습니다. 각 경우에 대해 별도의 함수를 작성하지 않고도 두 개, 세 개 또는 열 개의 숫자 합계를 계산하고 싶을 수 있습니다. 루아(Lua)는 이를 위해 특별한 문법인 세 개의 점 ...을 제공합니다.
함수의 매개변수 목록에 ...를 넣으면, 어떠한 개수의 인자도 받을 수 있는 가변 인자 함수(variadic function)가 됩니다:
function sum(...)
-- 함수 본문
end함수 내부에서 ...을 다시 사용하여 이 인수들에 접근할 수 있습니다. 이들을 더 쉽게 다루기 위해 중괄호를 사용하여 테이블로 묶을 수 있습니다:
function sum(...)
local args = {...}
local total = 0
for i = 1, #args do
total = total + args[i]
end
return total
end
print(sum(5, 10, 15)) -- 출력: 30
print(sum(1, 2, 3, 4, 5)) -- 출력: 15{...} 표현식은 함수에 전달된 모든 인수를 포함하는 리스트 스타일의 테이블을 생성합니다. 그런 다음 길이 연산자 # 또는 ipairs()를 사용하여 다른 테이블과 마찬가지로 이 테이블을 반복할 수 있습니다.
챌린지
쉬움임의의 개수의 숫자 인자를 받아 그 평균을 반환하는 calculateAverage 함수를 작성하세요.
가변 인자 구문인 ...을 사용하여 유연한 개수의 인자를 받고, 이를 테이블에 담아 합계를 계산한 뒤 개수로 나누세요.
참고: 시작 코드("Don't touch this code"로 표시됨)는 입력에서 숫자를 읽어 tonumber()를 사용하여 텍스트를 숫자로 변환하고, numbers라는 테이블에 저장합니다. 마지막에 unpack(numbers)를 사용하여 함수를 호출하는데, 이는 테이블의 값을 개별 인자로 펼쳐서 전달하므로 여러분의 함수는 이를 ...으로 받게 됩니다. 이 코드를 자세히 이해하거나 수정할 필요는 없습니다. calculateAverage 작성에만 집중하세요.
로직:
{...}를 사용하여 모든 인자를 테이블에 담습니다.- 테이블을 반복하며 모든 숫자의 합계를 계산합니다.
- 합계를 인자의 개수로 나누어 평균을 구합니다.
- 평균을 숫자로 반환합니다.
매개변수:
...(숫자들): 가변적인 개수의 숫자 인자
반환값: 제공된 모든 숫자의 평균 (숫자)
치트 시트
Lua는 세 개의 점 구문 ...을 사용하여 임의의 개수의 인수를 받을 수 있는 가변 인자 함수(variadic functions)를 지원합니다:
function sum(...)
-- 함수 본문
end가변 인자 함수 내부에서는 {...}을 사용하여 인수를 테이블로 묶습니다:
function sum(...)
local args = {...}
local total = 0
for i = 1, #args do
total = total + args[i]
end
return total
end
print(sum(5, 10, 15)) -- 출력: 30
print(sum(1, 2, 3, 4, 5)) -- 출력: 15{...} 표현식은 모든 인수를 포함하는 테이블을 생성합니다. 길이 연산자 # 또는 ipairs()를 사용하여 이를 반복(iterate)할 수 있습니다.
직접 해보기
-- 이 코드를 수정하지 마세요 --
local numbers = {}
while true do
local input = io.read()
if input == nil or input == "" then
break
end
local num = tonumber(input)
if num then
table.insert(numbers, num)
end
end
-------------------------
function calculateAverage(...)
-- 여기에 코드를 작성하세요
end
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.