기본 함수

기본 함수 (Basic Functions)

기본 함수(basic functions)는 전역 네임스페이스에 직접 노출되는 함수들이에요. 루아 코드에서 이름만으로 호출할 수 있어요.

assert

assert (v [, message])

v가 참(즉 falsenil이 아님)이면 v를 반환해요. v가 거짓이면 오류를 발생시켜요. message가 주어졌고 v가 거짓이면 그 메시지로 오류를 내요. message가 주어지지 않으면 인자 기본 오류 메시지를 사용해요.

local x = assert(io.open("file.txt", "r"), "파일을 열지 못했습니다")

collectgarbage

collectgarbage ([opt [, arg]])

가비지 컬렉터를 제어해요. opt 옵션에 따라 동작이 달라져요.

  • "collect" — 즉시 전체 가비지 컬렉션을 수행하고 0을 반환해요.
  • "stop" — 컬렉터를 정지시켜요.
  • "restart" — 컬렉터를 다시 시작해요.
  • "count" — 현재 사용 중인 메모리의 총량을 KB 단위(실수)로 반환해요. 두 번째 반환값으로 바이트 단위 일부(0~1023)도 반환해요.
  • "step" — 컬렉터를 한 단계 진행해요. 컬렉터가 어떤 작업을 수행했으면 true, 그렇지 않으면 false를 반환해요.
  • "setpause" — 증분 모드의 일시 정지 값을 arg로 설정해요. 이전 값을 반환해요.
  • "setstepmul" — 증분 모드의 스텝 승수를 arg로 설정해요. 이전 값을 반환해요.
  • "isrunning" — 컬렉터가 실행 중인지 반환해요.
  • "incremental" — 증분 모드로 전환하고, 선택적으로 pause, stepmul, stepsize 값을 설정해요.
  • "generational" — 세대 모드로 전환하고, 선택적으로 minor, major 값을 설정해요.

dofile

dofile ([filename])

파일의 내용을 청크로 읽어 실행하고, 그 청크의 반환값을 반환해요. filename이 없으면 표준 입력(stdin)을 읽어요. 오류가 발생하면 처리되지 않고(보호되지 않고) 전파돼요. loadfile + 보호되지 않은 호출과 유사해요.

error

error (message [, level])

오류를 발생시켜요. message는 어떤 값이든 될 수 있어요 (보통 문자열). level은 오류 위치 정보를 어떻게 덧붙일지 정해요.

  • level = 1 (기본값): error를 호출한 위치를 오류 위치로 사용.
  • level = 2: error를 호출한 함수를 호출한 위치를 사용.
  • level = 0: 위치 정보를 추가하지 않음.

_G

_G

전역 테이블(global table)을 가리키는 전역 변수예요. _G 자체는 전역 테이블을 담고 있어서, _G.foo처럼 전역 변수 foo에 접근하는 것과 foo에 접근하는 게 같아요. _G["print"]print와 같아요.

getmetatable

getmetatable (object)

object의 메타테이블을 반환해요. 메타테이블의 __metatable 필드가 있으면 그 값을 대신 반환해요. 메타테이블이 없으면 nil을 반환해요.

ipairs

ipairs (t)

순회 반복자 함수, 상태, 초기 제어 변수(0) 세 개를 반환해요. 이 세 값을 일반 for(for i, v in ipairs(t))로 사용하면 배열 부분(1부터 시작하는 연속 정수 키)을 순회해요. t[1], t[2], ... 가 nil이 아닐 때까지 반복해요. __index 메타메서드는 사용하지 않아요.

load

load (chunk [, chunkname [, mode [, env]]])

chunk를 루아 청크로 읽어 컴파일한 함수를 반환해요. chunk는 문자열이거나 읽기 함수(리더, reader)일 수 있어요.

  • chunk가 문자열이면 그 문자열을 청크로 컴파일해요.
  • chunk가 함수면, 그 함수는 청크를 조각별로 반환하는 리더로 취급돼요 (각 호출이 문자열 조각 또는 nil 반환).
  • chunkname은 오류 메시지와 디버그 정보에 쓰일 청크의 이름이에요.
  • mode는 청크가 텍스트("t"), 바이너리("b"), 또는 둘 다("bt", 기본값)인지 나타내요.
  • env는 청크의 전역 환경(_ENV)으로 쓸 테이블이에요.

성공하면 로드된 함수를 반환하고, 실패하면 nil과 오류 메시지를 반환해요.

loadfile

loadfile ([filename [, mode [, env]]])

filename의 파일 내용을 청크로 컴파일한 함수를 반환해요. filename이 없거나 nil이면 표준 입력을 읽어요. modeenvload와 동일한 의미예요. 성공 시 함수, 실패 시 nil과 오류 메시지를 반환해요.

next

next (table [, index])

프로그램이 테이블의 모든 필드를 순회할 수 있게 해요. next(t, index)는 테이블 t에서 index 다음의 키-값 쌍을 반환해요. indexnil이면 첫 번째 쌍을 반환하고, 더 이상 없으면 nil을 반환해요. 반환 값은 key, value 두 개예요. 순회 중에 테이블을 변경하면 안 돼요 (순회 동작이 정의되지 않음). indexnil을 전달하면 처음부터 시작해요.

pairs

pairs (t)

테이블 전체(모든 키)를 순회하는 반복자 함수, 테이블 t, 초기 제어 값 nil 세 개를 반환해요. for k, v in pairs(t)로 사용해요. 순회 순서는 지정되지 않으며 테이블 내부 구현에 따라 달라져요. __pairs 메타메서드가 있으면 그것을 사용해요.

pcall

pcall (f [, arg1, ...])

함수 f를 보호 모드(protected mode)로 호출해요. 성공하면 truef의 반환값들, 실패하면 false와 오류 객체를 반환해요. 오류가 발생해도 pcall 자체는 반환되어, 프로그램이 오류를 처리할 수 있게 해요.

local ok, result = pcall(function() return risky() end)
if not ok then print("오류:", result) end

print

print (...) (생략 — 여러 값을 공백으로 구분해 출력)

각 인자를 tostring으로 변환한 뒤 공백으로 구분해 표준 출력에 출력하고, 마지막에 줄바꿈을 추가해요. print는 디버깅용으로만 사용하기를 권장해요.

rawequal

rawequal (v1, v2)

메타메서드를 호출하지 않고 두 값 v1, v2가 같은지(참조 또는 값) 비교해서 boolean을 반환해요.

rawget

rawget (table, index)

table[index]의 값을, 메타메서드(__index)를 사용하지 않고 직접 가져와요. indexnil이 될 수 없어요.

rawlen

rawlen (v)

v의 길이를, 메타메서드를 사용하지 않고 반환해요. v는 문자열 또는 테이블이어야 해요.

rawset

rawset (table, index, value)

table[index] = value를, 메타메서드(__newindex)를 사용하지 않고 직접 수행해요. table을 반환해요.

select

select (index, ...)

index에 따라 인자를 선택하거나 개수를 반환해요.

  • index가 숫자면 ...에서 index 번째부터 끝까지의 인자들을 반환해요.
  • index"#"이면 인자의 총 개수를 반환해요.
print(select("#", "a", "b", "c"))  --> 3
print(select(2, "a", "b", "c"))    --> b c

setmetatable

setmetatable (table, metatable)

테이블 table의 메타테이블을 metatable로 설정해요. metatablenil이면 메타테이블을 제거해요. table__metatable 필드가 있으면 오류가 발생해요. 변경된 테이블을 반환해요.

tonumber

tonumber (e [, base])

e를 숫자로 변환하려 시도해요. 변환할 수 있으면 숫자, 없으면 nil을 반환해요.

  • base가 주어지면 e를 그 진법의 정수 리터럴로 해석해요 (2~36).
  • base가 없으면 e가 숫자(또는 숫자로 보이는 문자열, 예: "10", "3.5", "0xff")면 그 숫자, 아니면 nil.
print(tonumber("10"))      --> 10
print(tonumber("0xff"))    --> 255
print(tonumber("010", 8))  --> 8
print(tonumber("abc"))     --> nil

tostring

tostring (v)

v의 문자열 표현을 반환해요. v__tostring 메타메서드가 있으면 그것을 호출해 결과를 반환해요. 숫자는 합리적인 표현으로 변환되고, 테이블/함수/스레드/userdata는 기본 표현(주소 포함)을 반환해요.

print(tostring(3.14))            --> 3.14
print(tostring({}))              --> table: 0x...

type

type (v)

v의 타입 이름을 나타내는 문자열을 반환해요. 가능한 값: "nil", "boolean", "number", "string", "function", "thread", "table", "userdata".

print(type(10))      --> number
print(type("x"))     --> string
print(type(nil))     --> nil
print(type({}))      --> table

_VERSION

_VERSION

현재 사용 중인 루아 버전을 나타내는 문자열, 예: "Lua 5.4".

warn

warn (msg1, ...)

모든 인자를 연결해 경고 메시지를 제어하고 표준 오류 출력(stderr)에 출력해요. W 환경 변수나 자세한 설정에 따라 동작이 달라질 수 있어요. 경고는 보호된 호출 안에서 발생해도 전달돼요.

xpcall

xpcall (f, msgh [, arg1, ...])

이 함수는 pcall과 유사하지만, 오류가 발생했을 때 오류 객체를 인자로 하는 메시지 핸들러 msgh를 추가로 호출해요. msgh의 반환값이 새 오류 객체로 사용돼요. xpcall은 성공 시 true와 반환값들, 실패 시 false와 (핸들러가 만든) 오류 객체를 반환해요.

local ok, err = xpcall(risky, debug.traceback)

raw 정리

rawget, rawset, rawequal, rawlen은 메타메서드(특히 __index/__newindex)를 우회해 원시 테이블 연산을 수행하는 함수예요. 프로토콜을 지키지 않는 로우 레벨 접근이 필요할 때 쓰여요.

출처: 기본 함수 (Basic Functions)

본문

기본 함수 사용 시 유의점

  • print는 실행 환경에 따라 기본 출력이 달라질 수 있어요 (독립 실행 인터프리터는 표준 출력).
  • load/loadfile/dofile은 권한(샌드박스) 모델에서 주의해야 해요 — 로드된 청크는 env로 제한할 수 있어요.
  • collectgarbage는 성능 조정과 메모리 관리를 위한 고급 함수예요.

더 알아보기