Programming

Lua 언어란?

ipxy 2025. 3. 31. 15:00
728x90

 

🔷 Lua 언어란?

Lua는 1993년 브라질의 PUC-Rio 대학에서 개발된 경량 스크립트 언어입니다. "루아(Lua)"는 포르투갈어로 "달(Moon)"을 뜻하며, 작고 효율적이면서도 유연한 언어로 유명합니다.

✅ 대표적인 특징:

  • 가볍다 (Lightweight)
  • 빠르다 (Fast)
  • 내장하기 쉽다 (Embeddable)

🔶 주요 특징 및 기능 소개

1. ✏️ 간결한 문법

Lua는 문법이 단순해서 배우기 쉽습니다. 복잡한 선언 없이 변수, 함수 등을 간단하게 정의할 수 있습니다.

-- Hello World 예제
print("Hello, Lua!")

2. 🧠 동적 타이핑

변수를 선언할 때 자료형을 명시할 필요 없이, 자동으로 타입을 결정합니다.

x = 10        -- 정수
x = "hello"   -- 문자열

3. 📦 테이블 (Table) 기반 자료구조

Lua의 유일한 복합 자료형으로, 배열, 딕셔너리, 객체 등 다양한 용도로 활용됩니다.

person = {
  name = "Alice",
  age = 30
}
print(person.name)

4. 🔁 반복문과 조건문

기본적인 조건문과 반복문을 지원합니다.

-- for 루프 예시
for i = 1, 5 do
  print(i)
end
-- if 문 예시
if x > 0 then
  print("Positive")
else
  print("Non-positive")
end

5. 🔧 함수(Function) 정의 및 일급 객체

함수는 변수처럼 다룰 수 있어, 고차 함수나 콜백 등도 쉽게 구현할 수 있습니다.

function add(a, b)
  return a + b
end

print(add(2, 3))

6. 🧩 C와의 연동 용이

Lua는 C 언어로 구현되어 있으며, C 코드에서 Lua를 호출하거나 Lua에서 C 함수를 호출할 수 있습니다. 이 덕분에 게임 엔진, IoT 디바이스, 임베디드 시스템 등에서 많이 사용됩니다.

 

언어 타입 스크립트 언어, 동적 타이핑
주요 자료형 숫자, 문자열, 불리언, 테이블, 함수
사용 환경 게임, IoT, 서버, 스크립팅
장점 가볍고 빠르며 내장하기 쉬움
단점 표준 라이브러리 비교적 간단함

 예제


✅ 1. 모듈(Module) 사용하기

Lua에서는 파일 단위로 모듈을 만들어 사용할 수 있어요.

🔸 mymath.lua (모듈 파일)

local mymath = {}

function mymath.add(a, b)
  return a + b
end

function mymath.mul(a, b)
  return a * b
end

return mymath

🔹 main.lua (사용하는 쪽)

local mymath = require("mymath")

print(mymath.add(10, 20))  -- 30
print(mymath.mul(3, 5))    -- 15

require는 Lua에서 모듈을 불러오는 기본 방식입니다.


✅ 2. 메타테이블(Metatable) 사용하기

Lua의 테이블은 강력한 기능을 갖춘 자료형인데, 메타테이블을 이용하면 연산자 오버로딩, 상속, 커스텀 동작 등을 정의할 수 있습니다.

🔸 연산자 오버로딩 예제

Vector = {}
Vector.__index = Vector

function Vector.new(x, y)
  return setmetatable({x = x, y = y}, Vector)
end

function Vector.__add(a, b)
  return Vector.new(a.x + b.x, a.y + b.y)
end

v1 = Vector.new(1, 2)
v2 = Vector.new(3, 4)
v3 = v1 + v2  -- 내부적으로 __add 호출

print(v3.x, v3.y)  -- 4 6

✅ 3. 코루틴(Coroutine)

Lua는 경량 스레드인 코루틴을 지원합니다. 비동기 처리나 상태 유지에 유용하죠.

🔸 예제: 상태 유지하는 생성기(generator)

function counter()
  local i = 0
  return coroutine.create(function()
    while true do
      i = i + 1
      coroutine.yield(i)
    end
  end)
end

co = counter()

for i = 1, 5 do
  local _, val = coroutine.resume(co)
  print(val)  -- 1, 2, 3, 4, 5
end

✅ 4. 객체 지향 프로그래밍 스타일

Lua에는 클래스 문법이 없지만, 테이블과 메타테이블을 활용하여 OOP 스타일로 작성할 수 있습니다.

🔸 클래스 흉내내기

Person = {}
Person.__index = Person

function Person:new(name, age)
  local obj = {name = name, age = age}
  setmetatable(obj, self)
  return obj
end

function Person:introduce()
  print("Hi, I'm " .. self.name .. ", " .. self.age .. " years old.")
end

p1 = Person:new("Alice", 30)
p1:introduce()  -- Hi, I'm Alice, 30 years old.

✅ 5. 클로저(Closure)와 함수 반환

Lua는 클로저를 통해 함수 안에서 함수를 만들고 상태를 유지할 수 있습니다.

function makeCounter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end

c = makeCounter()

print(c())  --> 1
print(c())  --> 2

🎯 정리

모듈 코드 분리와 재사용 라이브러리 구성
메타테이블 사용자 정의 동작 연산자 오버로딩, 상속
코루틴 상태 유지, 비동기 생성기, 네트워크 처리
OOP 스타일 클래스 흉내내기 게임 캐릭터, UI 구성 요소
클로저 상태 있는 함수 카운터, 필터링 함수

 

728x90