0Pricing
Lua Academy · 강의

가변 인수와 ... 연산자

...와 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.lua

table.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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 함수 정의와 호출
  2. 여러 반환 값
  3. 가변 인수와 ... 연산자
  4. Lua의 재귀
← Lua Academy(으)로 돌아가기