Lua
개요
루아(Lua)는 가벼운 명령형/절차적 언어로, 주로 스크립트로 사용된다.[1]
진짜 문서 화딱지 나네 아 ㅋㅋ
애초에 스크립팅을 주 목적으로 설계됐다고 위키에서도 언급하고 있다.[2]
만들어진 목적이 명확한 편이다.
C언어를 사용하는 조직에서 연산 성능은 이미 충분하니 C언어의 아쉬운 점을 보완하며 같이 사용할 수 있는 언어를 만든 게 시초다.
그래서 메모리 자동 관리, 문자열 동적 처리에 많은 편의성을 넣었다.
자세한 문법과 사용방법은 여기를 참고하자.[3]
vim 설정 만질 때 lua란 게 하도 많이 나오길래 평소에 궁금했는데 이번 기회에 조금이나마 공부해본다.
기능 및 특징
언어로서의 루아는 다음의 특징을 가진다.
- 가비지 컬렉션
- 동적 타이핑
- 객체 지향, 함수형 프로그래밍 가능(!)
- 컴파일 언어
- 스크립트인데.. 컴파일..? 싶지만 사실은 인터프리터로 실행을 할 때 매우 빠르게 컴파일된 후 실행된다.
- main 없음...
- 애초에 확장 언어로 개발돼 다른 프로그램에서 임베딩하여 사용하는 게 기본이다.
- 단일로 실행하는 건 사실 루아 host 인터프리터에서 코드를 임베딩하여 실행되는 것이다!
자료형
특징 위주로 정리한다.
- nil
- 아무것도 없음을 나타낸다.
- false와 같은 진위 취급을 받는다.
- boolean
- number
- 서브 타입으로 integer, float를 가진다.
- 연산 시 자동 형변한
- string - 불변 바이트 시퀀스.
- function - C로 쓰여진 함수도 사용 가능
- userdata
- 원시 메모리 블록을 나타낸다.
- 임의의 C 데이터를 루아 변수로 넣을 때 사용한다.
- full userdata - 루아가 직접 관리하는 메모리 블록 객체
- light userdata - C 포인터 같은 가벼운 사용자 데이터
- 이 값들은 루아 차원에서는 변형될 수 없고 오직 C api를 거쳐야 한다.
- thread - 자체적인 차원의 스레드 실행 단위
- table
- nil, NaN(Not a Number)만 빼고 아무 원소나 받는 배열
- array, list, set, graph 등 다양한 그룹 자료형을 나타낼 수 있다.
- 함수도 일급 클래스라 테이블에 넣을 수 있다.
- 메서드도 가질 수 있다.
그냥 다 해먹어라
메타테이블
모든 값은 메타테이블을 가질 수 있다.
여기에는 특정 조건들에 발동되는 함수들이 들어있다.
가령 어떤 변수에 더하기 연산을 하면 이때 __add
필드의 함수가 실행된다.
getmetatable, setmetatable을 통해 조회, 조작 가능.
요런 것들이 있다.
코루틴 돌리기
다음은 코루틴으로 동시성을 수행하는 코드.
function foo (a)
print("foo", a)
return coroutine.yield(2*a)
end
co = coroutine.create(function (a,b)
print("co-body", a, b)
local r = foo(a+1)
print("co-body", r)
local r, s = coroutine.yield(a+b, a-b)
print("co-body", r, s)
return b, "end"
end)
print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, "r"))
print("main", coroutine.resume(co, "x", "y"))
print("main", coroutine.resume(co, "x", "y"))
기본 사용법
기본적인 예약어와 연산자이다.
-- 이건 주석
-- 변수 선언하기
x = 10
-- 인덱스 접근 시 이렇게
t = { "a", "b", "c" }
print(t[1])
-- .으로도 가능
person = { name = "John", age = 30 }
print(person.name)
-- do, end로 지역 실행 구분
x = 10
do
local x = 5
print(x) --> 5
end
print(x)
--
block ::= {stat}
-- 반복문
i = 1
while i <= 5 do
print(i)
i = i + 1
end
i = 1
repeat
print(i)
i = i + 1
until i > 5
-- 조건문
x = 3
if x == 1 then
print("one")
elseif x == 2 then
print("two")
else
print("other")
end
-- 테이블 만들기
t = { "apple", "banana", "cherry" }
-- 동적 키 가능!
key = "score"
t = { [key] = 100 }
-- 문자열 붙이기
print("Hello" .. " World")
-- 함수는 일급 객체
f = function()
print("hi")
end
-- 재귀 돌리려면 선언부터 해야하고 local로 보장
local function f()
f() -- 가능
end
-- 멀티 리턴
function f()
return 1, 2, 3
end
-- 인자를 이렇게 받는 것도 가능
function f(...)
local x, y = ...
print(x, y)
end
하위 문서
이름 | is-folder | index | noteType | created |
---|---|---|---|---|
Go | true | - | knowledge | 2025-04-03 |
Python | true | 0 | knowledge | 2025-05-02 |
Lua | false | 4 | knowledge | 2025-06-07 |
관련 문서
EXPLAIN - 파생 문서
이름0 | related | 생성 일자 |
---|
기타 문서
Z0-연관 knowledge, Z1-트러블슈팅 Z2-디자인,설계, Z3-임시, Z5-프로젝트,아카이브, Z8,9-미분류,미완이름0 | 코드 | 타입 | 생성 일자 |
---|