Lua 치트시트
마지막 업데이트
Hello World 및 코드 실행
Lua는 간결합니다 - 한 문장이면 실행됩니다.
| 작업 | 문법 |
|---|---|
| 한 줄 출력 | print("Hello, World!") |
| 여러 값 출력 | print("x", 1, true) |
| 줄바꿈 없이 쓰기 | io.write("Hi") |
| 주석 | -- this is a comment |
| 여러 줄 주석 | --[[ ... ]] |
| 문자열 연결 | print("Hi " .. name) |
| 파일 실행 | lua app.lua |
| 대화형 셸 | lua |
변수 및 타입
변수는 기본적으로 전역이며, local로 지역 변수를 선언합니다.
| 작업 | 문법 |
|---|---|
| 지역 변수 | local age = 30 |
| 전역 변수 | count = 0 |
| 다중 할당 | local a, b = 1, 2 |
| 여덟 가지 타입 | nil, boolean, number, string, table, function, userdata, thread |
| nil / 불리언 | nil, true, false |
| 타입 확인 | type(x)는 "number"를 반환 |
| 숫자로 변환 | tonumber("42") |
| 문자열로 변환 | tostring(42) |
문자열
문자열은 불변이며, 작은따옴표와 큰따옴표 모두 동작합니다.
| 작업 | 문법 |
|---|---|
| 길이 | #s 또는 string.len(s) |
| 연결 | s1 .. s2 |
| 대문자 / 소문자 | s:upper(), s:lower() |
| 부분 문자열 | s:sub(1, 3) |
| 부분 문자열 찾기 | s:find("ell") |
| 치환 (gsub) | s:gsub("a", "b") |
| 서식 지정 | string.format("%05d", 42) |
| 긴 문자열 | [[ multi\nline ]] |
테이블 (핵심 자료 구조)
테이블은 Lua의 유일한 구조화 타입입니다 - 배열, 맵, 객체 역할을 합니다.
| 작업 | 문법 |
|---|---|
| 빈 테이블 | local t = {} |
| 배열 스타일 (1부터 시작) | local t = {10, 20, 30} |
| 배열 원소 접근 | t[1] (첫 번째 원소) |
| 맵 스타일 테이블 | local u = {name = "Ada", age = 30} |
| 맵 값 접근 | u.name 또는 u["name"] |
| 값 설정 | t[4] = 40, u.email = "a@x.com" |
| 배열 부분의 길이 | #t |
| 배열 순회 (ipairs) | for i, v in ipairs(t) do ... end |
| 모든 키 순회 (pairs) | for k, v in pairs(u) do ... end |
| 중첩 테이블 | local m = {a = {1, 2}} |
제어 흐름
블록은 end로 닫으며, nil과 false만 거짓입니다.
| 작업 | 문법 |
|---|---|
| if / elseif / else | if x > 0 then ... elseif x < 0 then ... else ... end |
| 논리 연산자 | and, or, not |
| 숫자 for | for i = 1, 10 do ... end |
| 스텝이 있는 for | for i = 10, 1, -1 do ... end |
| while 반복문 | while x < 100 do ... end |
| repeat-until | repeat ... until done |
| break | break |
| 같지 않음 연산자 | if a ~= b then ... end |
함수
함수는 일급 값이며 여러 결과를 반환할 수 있습니다.
| 작업 | 문법 |
|---|---|
| 함수 정의 | function add(a, b) return a + b end |
| 지역 함수 | local function square(x) return x * x end |
| 익명 함수 | local f = function(x) return x * 2 end |
| 여러 반환값 | function bounds() return 1, 10 end |
| 여러 반환값 캡처 | local lo, hi = bounds() |
| 가변 인자 함수 | function sum(...) ... end |
| 가변 인자 수집 | local args = {...} |
| 메서드 (콜론 문법) | function obj:greet() ... end |
문자열 라이브러리
문자열 라이브러리의 자주 쓰는 함수 (s:fn() 형태로 호출 가능).
| 함수 | 기능 |
|---|---|
string.len(s) | 문자열의 길이 |
string.sub(s, i, j) | 인덱스 i부터 j까지의 부분 문자열 |
string.upper(s) | 대문자로 변환한 복사본 |
string.rep(s, n) | 문자열을 n번 반복 |
string.find(s, p) | 패턴을 찾아 시작/끝 반환 |
string.match(s, p) | 첫 패턴 일치 반환 |
string.gsub(s, p, r) | 모든 패턴 일치 치환 |
string.format(fmt, ...) | 값을 문자열로 서식 지정 |
테이블 및 수학 라이브러리
배열 스타일 테이블과 숫자를 다루기 위한 도우미.
| 함수 | 기능 |
|---|---|
table.insert(t, v) | 끝에 값 추가 |
table.insert(t, i, v) | 위치 i에 v 삽입 |
table.remove(t, i) | i 위치의 원소를 제거하고 반환 |
table.concat(t, ", ") | 원소를 문자열로 결합 |
table.sort(t) | 배열을 제자리 정렬 |
math.floor(x) / math.ceil(x) | 내림 / 올림 |
math.max(...) / math.min(...) | 가장 큰 / 작은 인자 |
math.random(1, 6) | 범위 안의 임의 정수 |
메타테이블 (간략히)
메타테이블로 테이블의 동작을 사용자 정의할 수 있습니다 - 연산자, 인덱싱 등.
| 작업 | 문법 |
|---|---|
| 메타테이블 설정 | setmetatable(t, mt) |
| 메타테이블 가져오기 | getmetatable(t) |
| 없는 키에 대한 대체 | mt.__index = defaults |
| 함수를 통한 기본값 | mt.__index = function(t, k) ... end |
| 덧셈 사용자 정의 | mt.__add = function(a, b) ... end |
| tostring 사용자 정의 | mt.__tostring = function(t) ... end |
| 프로토타입 기반 OOP | mt.__index = ClassTable |
가장 자주 쓰는 Lua 문법을 한 페이지에 담았습니다. 이 Lua 치트시트는 언어 핵심을 위한 빠른 참조 자료입니다 - 변수와 타입, 문자열, 제어 흐름, 함수, 그리고 Lua의 유일하고 유연한 자료 구조 역할을 하는 테이블을 다루며, 표준 라이브러리와 메타테이블도 살짝 엿봅니다.
여기 나오는 모든 내용은 표준 Lua이며 기본 인터프리터에서 실행됩니다. 필요한 것을 복사하거나, Lua 플레이그라운드에서 모든 코드를 바로 실행해 보세요 - 설치가 필요 없습니다.
Lua 치트시트 자주 묻는 질문
이 Lua 치트시트는 무료인가요?
네. 이 Lua 치트시트는 완전히 무료이며 회원 가입이 필요 없습니다. 즐겨찾기에 추가해 두고 테이블 연산, 문자열 함수, 제어 흐름 키워드를 찾아봐야 할 때마다 다시 방문하세요.
Lua 테이블이 어떻게 배열이면서 동시에 맵이 될 수 있나요?
테이블은 그저 키-값 쌍의 집합이며, 키는 어떤 값이든 될 수 있습니다. 1부터 시작하는 연속된 정수 키(
{10, 20, 30})를 쓰면 테이블이 배열처럼 동작하고, 문자열 키({name = "Ada"})를 쓰면 맵처럼 동작합니다. 같은 테이블 안에서 둘을 섞을 수도 있습니다. 그래서 Lua는 구조화 타입이 하나만 있으면 됩니다 - 테이블이 배열, 딕셔너리, 셋, 객체를 모두 포괄합니다.Lua는 왜 1부터 시작하는 인덱싱을 사용하나요?
관례와 설계상 Lua 배열은 0이 아니라 인덱스 1에서 시작합니다 - 그래서
t[1]이 첫 번째 원소이고 #t가 개수입니다. 길이 연산자 #와 table.insert, ipairs 같은 라이브러리 함수는 모두 이 1부터 시작하는 관례를 전제하므로, 이를 지키면 배열 코드가 기대대로 동작합니다.Lua를 온라인에서 연습할 수 있나요?
네. Lua 플레이그라운드를 열어 이 치트시트의 어떤 코드든 브라우저에서 실행해 보세요 - Lua 설치가 필요 없습니다. 체계적으로 배우고 싶다면, Coddy의 무료 인터랙티브 Lua 강좌가 변수와 테이블부터 함수와 메타테이블까지 단계별로 안내합니다.
이 치트시트는 초보자에게 적합한가요?
네. 가장 흔한 주제(변수, 문자열, 테이블, 제어 흐름)부터 고급 주제(표준 라이브러리와 메타테이블)까지 순서대로 정리되어 있어, 첫날부터 상단 섹션을 사용하고 점차 나머지로 넓혀갈 수 있습니다.