배열로 사용하는 테이블
table.insert와 table.remove로 1부터 시작하는 배열을 만들고 조작합니다.
배열로 사용하는 테이블은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
1부터 시작하는 배열
Lua 배열은 1부터 시작하는 연속된 정수 키를 가진 테이블입니다. 이는 0부터 시작하는 대부분의 언어와 다릅니다. Lua에서는 이 규칙이 보편적이므로 모든 표준 라이브러리 함수가 1 기반 인덱싱을 가정합니다. 범위를 벗어난 접근은 오류가 아니라 nil을 반환합니다.
local colors = {"red", "green", "blue"}
print(colors[1]) -- red
print(colors[2]) -- green
print(colors[3]) -- blue
print(colors[0]) -- nil (no index 0)
print(#colors) -- 3 (length operator)table.insert와 table.remove
table.insert(t, val)은 끝에 추가합니다. table.insert(t, pos, val)은 특정 위치에 삽입하고 요소를 오른쪽으로 이동합니다. table.remove(t, pos)는 pos 위치의 요소를 제거합니다(기본값: 마지막 요소). 요소를 왼쪽으로 이동한 뒤 제거된 값을 반환합니다.
local stack = {}
table.insert(stack, "first")
table.insert(stack, "second")
table.insert(stack, "third")
print(#stack) -- 3
table.insert(stack, 2, "inserted")
print(stack[2]) -- inserted
local removed = table.remove(stack, 1)
print(removed) -- first
print(stack[1]) -- inserted테이블로 스택 구현하기
Lua 테이블은 스택으로 사용하기에 적합합니다. table.insert로 푸시하고 table.remove로 팝합니다. 두 작업 모두 기본적으로 테이블의 끝에서 수행되므로 분할 상환 시간은 O(1)입니다.
local stack = {}
-- Push
table.insert(stack, 10)
table.insert(stack, 20)
table.insert(stack, 30)
-- Pop
print(table.remove(stack)) -- 30
print(table.remove(stack)) -- 20
print(#stack) -- 1테이블로 큐 구현하기
큐(FIFO)는 테이블로 구현할 수 있지만 table.remove(t, 1)은 모든 요소를 이동하므로 O(n)입니다. 고성능 큐에는 이동을 피하도록 두 개의 포인터(헤드 및 테일 인덱스)를 사용합니다.
local head, tail = 1, 0
local queue = {}
local function enqueue(v)
tail = tail + 1
queue[tail] = v
end
local function dequeue()
if head > tail then return nil end
local v = queue[head]
queue[head] = nil
head = head + 1
return v
end
enqueue("a"); enqueue("b"); enqueue("c")
print(dequeue()) -- a
print(dequeue()) -- b# 길이 연산자
# 연산자는 테이블의 "경계"를 반환합니다. 즉, t[i] ~= nil이고 t[i+1] == nil인 인덱스 i를 반환합니다. 빈 위치가 없는 시퀀스에서는 이것이 배열 길이와 같습니다. 중간에 nil로 인한 빈 위치가 있으면 #의 결과는 정의되지 않으므로 table.pack을 사용하거나 길이를 직접 관리해야 합니다.
local t = {10, 20, 30, 40, 50}
print(#t) -- 5
-- Safe for dense arrays
for i = #t, 1, -1 do
io.write(t[i] .. " ")
end
print() -- 50 40 30 20 10배열 슬라이싱
Lua에는 내장 슬라이스 기능이 없지만 table.move(Lua 5.3 이상)나 직접 작성한 반복문으로 하위 배열을 추출할 수 있습니다. table.move(a1, f, e, t, a2)는 a1[f..e]의 요소를 a2의 t 위치부터 복사합니다.
local src = {10,20,30,40,50,60}
-- Manual slice
local function slice(t, from, to)
local result = {}
for i = from, to do
result[#result+1] = t[i]
end
return result
end
local sub = slice(src, 2, 4)
print(sub[1], sub[2], sub[3]) -- 20 30 40배열 뒤집기
양쪽 끝의 요소를 가운데를 향해 서로 교환하면 테이블을 제자리에서 뒤집을 수 있습니다. 이는 추가 메모리 없이 모든 Lua 배열에서 작동하는 대표적인 알고리즘입니다.
local function reverse(t)
local n = #t
for i = 1, math.floor(n / 2) do
t[i], t[n - i + 1] = t[n - i + 1], t[i]
end
end
local arr = {1, 2, 3, 4, 5}
reverse(arr)
for _, v in ipairs(arr) do
io.write(v .. " ")
end
print() -- 5 4 3 2 1배열 연결하기
두 배열을 하나로 합치려면 두 번째 배열을 순회하며 요소를 추가합니다. Lua 5.3 이상에서는 table.move가 이를 효율적으로 처리합니다. 결과는 두 배열의 모든 요소를 순서대로 포함하는 새 테이블입니다.
local function concat(a, b)
local result = {}
for _, v in ipairs(a) do result[#result+1] = v end
for _, v in ipairs(b) do result[#result+1] = v end
return result
end
local merged = concat({1,2,3}, {4,5,6})
for i, v in ipairs(merged) do
io.write(v .. " ")
end
print() -- 1 2 3 4 5 6중첩 배열 평탄화
중첩 배열을 재귀적으로 평탄화합니다. 요소가 테이블이면 그 안으로 재귀 호출하고, 그렇지 않으면 결과에 추가합니다. 이는 재귀적인 테이블 순회의 자연스러운 활용입니다.
local function flatten(t, result)
result = result or {}
for _, v in ipairs(t) do
if type(v) == "table" then
flatten(v, result)
else
result[#result+1] = v
end
end
return result
end
local nested = {1, {2, 3}, {4, {5, 6}}, 7}
local flat = flatten(nested)
print(table.concat(flat, ", ")) -- 1, 2, 3, 4, 5, 6, 7집합으로서의 배열
값을 키로 사용하고 값에는 true를 저장하는 테이블로 집합을 구현할 수 있습니다. 집합 멤버십 검사는 O(1)입니다. 배열에서 집합을 만들면 중복이 제거됩니다. pairs로 순회하여 다시 배열로 변환할 수 있습니다.
local function toSet(arr)
local set = {}
for _, v in ipairs(arr) do set[v] = true end
return set
end
local nums = {3,1,4,1,5,9,2,6,5,3}
local set = toSet(nums)
local unique = {}
for k in pairs(set) do unique[#unique+1] = k end
table.sort(unique)
print(table.concat(unique, " ")) -- 1 2 3 4 5 6 9빠른 확인
인수를 하나만 지정하여 table.remove(t)를 호출하면 어떻게 됩니까?
복습: 배열로서의 테이블
요약:
- Lua 배열은 인덱스가 1부터 시작하는 테이블입니다
- 추가와 제거에는
table.insert/table.remove를 사용합니다 - 빈칸이 없는 시퀀스에서는
#t가 길이를 반환합니다 - 스택: 끝에서 삽입하고 제거합니다(O(1))
- 큐: O(n) 이동을 피하려면 머리와 꼬리 포인터를 사용합니다
- O(1) 멤버십 검사를 위해 테이블을 집합으로 사용합니다
AI 튜터와 함께 Lua을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 40
- 레슨
- 159
자주 묻는 질문
“배열로 사용하는 테이블” 강의는 무료인가요?
네 — “배열로 사용하는 테이블” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“배열로 사용하는 테이블”에서 뭘 배우나요?
table.insert와 table.remove로 1부터 시작하는 배열을 만들고 조작합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“배열로 사용하는 테이블” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.