문법 · Lua · beginner

테이블 깊게: 배열부·해시부·ipairs

Lua 테이블의 두 얼굴과 순회 함정.

배우기 · Lua 문법 · 14분 · 3/7 · lua · 테이블

이 트랙 목차 (7)
  1. 1. Lua 기초: 변수·테이블·문자열
  2. 2. Lua 제어·반복·함수
  3. 3. 테이블 깊게: 배열부·해시부·ipairs
  4. 4. 문자열·패턴: match, gmatch, gsub
  5. 5. 에러와 pcall: 실패를 값으로
  6. 6. 모듈과 require 감각
  7. 7. 숫자 for와 인덱스 함정

하나의 값이 두 용도

Lua의 핵심 자료구조는 테이블 하나입니다.

local t = {10, 20, 30}      -- 배열부 (1부터)
t.name = "x"               -- 해시부
t["k"] = true

인덱스는 1부터입니다. 0을 쓰면 해시 키로 들어가 #t·ipairs에 안 잡힐 수 있습니다.

길이 연산자

#t는 배열부 길이 감각입니다. 구멍이 있으면(nil이 중간에 있으면) 길이 정의가 애매해집니다.
연속된 1..n만 쓰는 편이 안전합니다.

ipairs vs pairs

for i, v in ipairs(t) do
  -- 1,2,3... 순서 보장 (배열부)
end

for k, v in pairs(t) do
  -- 키 순서 비보장 (해시 포함)
end

정렬·인덱스가 필요하면 ipairs 또는 숫자 키를 모아 정렬하세요.

집합·빈도

local seen = {}
seen[x] = true
local freq = {}
freq[x] = (freq[x] or 0) + 1

nil을 값으로 넣으면 키가 지워집니다. “없음”과 “값 nil”을 구분해야 하면 센티널을 쓰세요.

연습

문자열을 공백으로 나눠 중복을 제거한 뒤 정렬해 이어 붙이는 solve를 만들어 보세요 (lua-unique 계열).

삽입·삭제

table.insert(t, value)       -- 끝에 추가
table.insert(t, i, value)    -- i 위치에
local v = table.remove(t)    -- 끝에서 제거

중간 삽입은 O(n)입니다. 빈번하면 다른 구조를 고려하세요.

정렬

table.sort(t)  -- 기본: 오름차순 (비교 가능해야 함)
table.sort(t, function(a, b) return a > b end)

nil이 배열부 중간에 있으면 정렬·길이가 깨집니다.

한 줄

> 숫자 키 1..n은 배열부, 그 외는 해시부. 순회 함수를 맞게 고른다.

관련 짧은 원리

관련 문제