가변 인수와 ... 연산자
...와 select()를 사용해 길이가 가변적인 인수 목록을 처리합니다.
가변 인수와 ... 연산자은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
가변 인수
Lua 함수는 매개변수 목록에 ...(점 세 개)를 사용해 가변 개수의 인수를 받을 수 있습니다. 함수 내부에서 ...는 추가 인수를 나타냅니다. 이를 표현식에서 사용하거나 다른 함수에 전달하거나 테이블로 변환할 수 있습니다.
local function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3)) -- 6
print(sum(10, 20, 30, 40)) -- 100가변 인수에 select() 사용하기
select(n, ...)은 n번째 위치부터 끝까지의 인수를 반환합니다. select("#", ...)은 nil 값을 포함한 전체 인수 개수를 반환합니다. 이는 첫 번째 nil 빈 위치에서 멈추는 #{...}보다 안전합니다.
local function inspect(...)
local n = select("#", ...)
print("count:", n)
for i = 1, n do
print(i, select(i, ...))
end
end
inspect("a", "b", nil, "d")
-- count: 4
-- 1 a
-- 2 b
-- 3 nil
-- 4 d다른 함수에 ... 전달하기
f(...)를 사용하면 가변 인수를 다른 함수에 직접 전달할 수 있습니다. 호출에서 ...가 마지막 인수로 나타나면 모든 가변 인수가 전달됩니다. 함수를 감싸거나 기록 기능을 만들 때 유용합니다.
local function log(level, ...)
io.write("[" .. level .. "] ")
print(...)
end
log("INFO", "Server started on port", 8080)
log("ERROR", "File not found:", "config.lua")
-- [INFO] Server started on port 8080
-- [ERROR] File not found: config.luatable.pack과 table.unpack
table.pack(...)을 사용하면 가변 인수를 테이블로 변환하고 개수를 n 필드에 저장할 수 있습니다. table.unpack(t, i, j)를 사용하면 테이블을 다시 가변 인수로 변환할 수 있습니다. 이 두 함수를 함께 사용하면 가변 인수 목록을 완전히 제어할 수 있습니다.
local function pack_and_show(...)
local packed = table.pack(...)
print("n =", packed.n)
for i = 1, packed.n do
print(i, packed[i])
end
end
pack_and_show(10, nil, 30)
-- n = 3
-- 1 10
-- 2 nil
-- 3 30고정 인수와 가변 인수 함께 사용하기
함수에는 고정 매개변수와 가변 매개변수를 함께 사용할 수 있습니다. 고정 매개변수가 먼저 오고, ...가 나머지를 받습니다. 나머지가 ...에 들어가기 전에 고정 매개변수에 먼저 값이 할당됩니다.
local function printf(fmt, ...)
io.write(string.format(fmt, ...))
end
printf("Hello, %s! You are %d years old.\n", "Alice", 30)
printf("Pi is approximately %.4f\n", math.pi)
local function firstAndRest(first, ...)
print("first:", first)
print("rest count:", select("#", ...))
end
firstAndRest(1, 2, 3, 4)테이블 생성자에서 가변 인수 사용하기
가변 인수는 테이블 생성자에 직접 펼쳐 넣을 수 있습니다: {...}. 마지막 요소로 사용하면 모든 인수가 포함됩니다. 하지만 nil로 인한 빈 위치 때문에 #가 혼동될 수 있으므로 정확한 개수가 필요할 때는 table.pack을 사용하는 것이 좋습니다.
local function toArray(...)
return {...} -- collect all args as array
end
local arr = toArray("x", "y", "z")
for i, v in ipairs(arr) do
print(i, v)
end
-- 1 x
-- 2 y
-- 3 z가변 인수 표현식
...는 어떤 표현식 위치에도 나타날 수 있습니다. 다중 대입에서는 모든 값으로 펼쳐집니다. 산술 표현식에서는 첫 번째 값만 사용됩니다. 이러한 동작을 이해하면 ...를 다른 표현식과 함께 사용할 때 발생하는 미묘한 오류를 방지할 수 있습니다.
local function first(...)
local x = ...
return x
end
print(first(10, 20, 30)) -- 10 (only first)
local function addFirst(n, ...)
local x = ...
return n + x
end
print(addFirst(5, 3, 99)) -- 8 (3 is first ...)print()는 가변 인수를 사용합니다
Lua에 내장된 print() 자체가 가변 인수 함수입니다. 임의의 개수의 인수를 받아 각각 문자열로 변환하고 탭으로 구분합니다. 이를 이해하면 이와 비슷한 유틸리티 함수를 작성하는 데 도움이 됩니다.
-- print is vararg
print(1, 2, 3) -- 1 2 3
print("a", nil, "b") -- a nil b
print() -- (empty line)
-- Reimplementing a simple print-like function
local function myprint(...)
local parts = {}
for i = 1, select("#", ...) do
parts[i] = tostring(select(i, ...))
end
io.write(table.concat(parts, "\t") .. "\n")
end
myprint(10, nil, 30)pcall로 전달하기
pcall과 가변 인수를 함께 사용하면 일반적인 안전 호출 래퍼를 만들 수 있습니다. 이 래퍼는 함수와 임의의 인수를 받아 pcall을 통해 호출하고, 결과 또는 오류를 반환합니다.
local function safeCall(fn, ...)
local ok, result = pcall(fn, ...)
if ok then
return result
else
print("Error:", result)
return nil
end
end
local function divide(a, b)
assert(b ~= 0, "division by zero")
return a / b
end
print(safeCall(divide, 10, 2)) -- 5.0
print(safeCall(divide, 10, 0)) -- Error: ...가변 인수 누적 패턴
가변 인수에서 흔히 사용하는 패턴은 모든 인수를 순회하며 결과를 누적하는 것입니다. 로컬 테이블을 사용하거나 select로 직접 합산할 수 있습니다. 두 방식 모두 유효하지만 인수가 많을 때는 테이블 방식이 더 깔끔합니다.
local function average(...)
local n = select("#", ...)
if n == 0 then return 0 end
local total = 0
for i = 1, n do
total = total + select(i, ...)
end
return total / n
end
print(average(10, 20, 30, 40)) -- 25.0
print(average(5)) -- 5.0빠른 확인
select("#", 1, nil, 3)은 무엇을 반환할까요?
복습: 가변 인수
요약:
function f(...)— 가변 인수를 받습니다select("#", ...)— nil을 포함해 안전하게 개수를 셉니다select(n, ...)— n번째 위치부터의 값을 반환합니다table.pack(...)— 가변 인수를 .n 개수 필드가 있는 테이블로 변환합니다table.unpack(t)— 테이블을 가변 인수로 변환합니다- 마지막 위치의
...는 모든 값으로 펼쳐지고, 중간 위치에서는 하나의 값만 제공합니다
자주 묻는 질문
“가변 인수와 ... 연산자” 강의는 무료인가요?
네 — “가변 인수와 ... 연산자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“가변 인수와 ... 연산자”에서 뭘 배우나요?
...와 select()를 사용해 길이가 가변적인 인수 목록을 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“가변 인수와 ... 연산자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.