Learn in 10 minutes

Learn in 10 minutes

10분만에 배우는 Lua

Lua는 엄청 가벼운 프로그래밍 언어로, 다른 프로그램에 내장해서 쓰기 딱이야. 알겠어? ‘월드 오브 워크래프트’나 Roblox 같은 게임에서도 쓰고, 설정 파일 스크립트로도 인기 많아.

1. 첫 번째 Lua 프로그램

자, 가장 기본부터 시작해보자. hello.lua 파일 만들고 안에 이렇게 써:

print("Hello, World!")

저장하고 터미널에서 이렇게 실행:

lua hello.lua

그럼 이렇게 나와:

Hello, World!

봐, 엄청 쉽지! print()는 화면에 글자 보여주는 함수야.

2. 기본 문법

Lua 문법은 진짜 간단해:

-- 이건 한 줄 주석
print("안녕, 세상!")

--[[
이건 여러 줄 주석
몇 줄이든 다 됨
]]

기억할 점:

  • 주석: 한 줄은 --, 여러 줄은 --[[ ]]
  • 문장: 한 줄에 한 명령, 세미콜론 필요 없어
  • 대소문자: 구별하니까 조심
  • 공백: 스페이스나 엔터 마음대로

3. 변수와 데이터 타입

Lua는 동적 타입이라 타입 선언 필요 없어:

-- 그냥 대입
이름 = "Lua"
나이 = 25
쩔어 = true
원주율 = 3.14159

-- 한번에 여러 개 대입도 가능
x, y, z = 10, 20, 30

-- 빈 값은 nil
빈변수 = nil

print("이름:", 이름)
print("나이:", 나이)
print("쩔어?:", 쩔어)

Lua 데이터 타입:

  • nil: 값 없음
  • boolean: true 아니면 false
  • number: 숫자 (정수, 실수 다)
  • string: 문자열
  • table: Lua의 만능 데이터 구조
  • function: 함수 (1급 객체)
  • userdata: C언어용
  • thread: 코루틴

4. 문자열 조작

-- 문자열 만드는 법
str1 = "안녕"
str2 = '세상'
str3 = [[여러 줄
문자열 편함]]

-- 문자열 연결은 ..
메시지 = str1 .. " " .. str2
print(메시지)  -- 출력: 안녕 세상

-- 문자열 길이는 #
길이 = #"안녕"
print(길이)   -- 출력: 2

-- 문자열 메서드
텍스트 = "hello world"
대문자 = 텍스트:upper()
소문자 = 텍스트:lower() 
부분 = 텍스트:sub(1, 5)

print(대문자)    -- 출력: HELLO WORLD
print(부분)      -- 출력: hello

5. 테이블 - Lua의 만능 컨테이너

테이블은 Lua의 최강 기능:

-- 배열로 쓰기 (인덱스 1부터)
과일 = {"사과", "바나나", "체리"}
print(과일[1])  -- 출력: 사과
print(과일[2])  -- 출력: 바나나

-- 딕셔너리로 쓰기
사람 = {
    이름 = "철수",
    나이 = 30,
    도시 = "서울"
}
print(사람.이름)    -- 출력: 철수
print(사람["나이"])  -- 출력: 30

-- 섞어서도 가능
혼합테이블 = {
    "사과",
    "바나나", 
    색상 = "빨강",
    개수 = 5
}

-- 테이블 조작
과일 = {"사과", "바나나"}
table.insert(과일, "체리")  -- 맨 뒤에 추가
table.insert(과일, 2, "오렌지") -- 2번째에 삽입

print(table.concat(과일, ", "))  -- 출력: 사과, 오렌지, 바나나, 체리

6. 제어 구조

-- if문
나이 = 18

if 나이 >= 18 then
    print("성인입니다")
elseif 나이 >= 13 then
    print("10대입니다")
else
    print("어린이입니다")
end

-- while 루프
카운터 = 1
while 카운터 <= 5 do
    print("카운트:", 카운터)
    카운터 = 카운터 + 1
end

-- for 루프 (숫자)
for i = 1, 5 do
    print("숫자:", i)
end

-- for 루프 (스텝 지정)
for i = 10, 1, -2 do
    print("카운트다운:", i)
end

-- for 루프 (테이블 순회)
과일 = {"사과", "바나나", "체리"}
for 번호, 과일명 in ipairs(과일) do
    print(번호, 과일명)
end

사람 = {이름 = "철수", 나이 = 30}
for ,  in pairs(사람) do
    print(, )
end

7. 함수

-- 기본 함수
function 인사(이름)
    return "안녕, " .. 이름 .. "!"
end

메시지 = 인사("영희")
print(메시지)  -- 출력: 안녕, 영희!

-- 여러返回值
function 계산(a, b)
    return a + b, a - b, a * b, a / b
end

, , ,  = 계산(10, 5)
print("합:", )        -- 출력: 합: 15
print("차:", ) -- 출력: 차: 5

-- 익명 함수 (람다)
곱하기 = function(x, y)
    return x * y
end

결과 = 곱하기(4, 5)
print(결과)  -- 출력: 20

-- 함수를 인자로
function 연산실행(x, y, 연산)
    return 연산(x, y)
end

결과 = 연산실행(6, 7, 곱하기)
print(결과)  -- 출력: 42

8. 모듈

코드를 나눠서 작성하자. 수학도구.lua 생성:

-- 수학도구.lua
local 수학도구 = {}

function 수학도구.더하기(a, b)
    return a + b
end

function 수학도구.곱하기(a, b)
    return a * b
end

return 수학도구

메인 파일에서 사용:

-- 메인.lua
local 수학도구 = require("수학도구")

결과 = 수학도구.더하기(10, 5)
print("더하기 결과:", 결과)  -- 출력: 더하기 결과: 15

결과 = 수학도구.곱하기(4, 6)
print("곱하기 결과:", 결과)  -- 출력: 곱하기 결과: 24

9. 에러 처리

-- pcall로 에러 잡기
function 위험작동()
    error("에러 발생!")
end

-- pcall는 보호 호출
성공, 결과 = pcall(위험작동)

if 성공 then
    print("성공:", 결과)
else
    print("실패:", 결과)
end

-- 커스텀 에러
function 나누기(a, b)
    if b == 0 then
        error("0으로 나눌 수 없음")
    end
    return a / b
end

성공, 결과 = pcall(나누기, 10, 0)
if not 성공 then
    print("에러:", 결과)
end

10. 실전 예제

-- 간단 계산기
function 계산기()
    print("🐮 간단 계산기")
    print("1. 더하기")
    print("2. 빼기") 
    print("3. 곱하기")
    print("4. 나누기")
    
    선택 = tonumber(io.read())
    print("첫 번째 숫자:")
    숫자1 = tonumber(io.read())
    print("두 번째 숫자:")
    숫자2 = tonumber(io.read())
    
    if 선택 == 1 then
        결과 = 숫자1 + 숫자2
        print("결과:", 결과)
    elseif 선택 == 2 then
        결과 = 숫자1 - 숫자2
        print("결과:", 결과)
    elseif 선택 == 3 then
        결과 = 숫자1 * 숫자2
        print("결과:", 결과)
    elseif 선택 == 4 then
        if 숫자2 ~= 0 then
            결과 = 숫자1 / 숫자2
            print("결과:", 결과)
        else
            print("❌ 0으로 나눌 수 없음")
        end
    else
        print("🤔 잘못된 선택")
    end
end

-- 사용하려면 주석 해제
-- 계산기()

-- 파일 조작
function 파일읽기(파일명)
    local 파일 = io.open(파일명, "r")
    if not 파일 then
        return nil, "파일 열 수 없음"
    end
    
    local 내용 = 파일:read("*a")
    파일:close()
    return 내용
end

내용, 에러 = 파일읽기("예제.txt")
if 내용 then
    print("파일 내용:", 내용)
else
    print("에러:", 에러)
end

마무리

Lua는 정말好用해! 특히:

  • 🎮 게임 스크립트 (많은 게임에서 사용)
  • 🔧 임베디드 개발 (가벼워서)
  • ⚙️ 설정 파일과 자동화
  • 🚀 고성능 needed場合 (LuaJIT와 함께)

Lua의 장점:

  • 엄청 가벼움: 용량 작음
  • 빠름: LuaJIT로 광속
  • 유연함: 동적 타입 + 만능 테이블
  • 어디서든 실행: 모바일부터 서버까지
  • 내장 쉬움: C/C++과 궁합 최고

더 깊이 배우고 싶다? 이거 해봐:

  • Lua 표준 라이브러리
  • 코루틴 (동시 프로그래밍)
  • 메타테이블과 메타메서드 (OOP 구현)
  • Lua와 C 연동
  • Love2D 게임 프레임워크

Lua는 배우기 쉽고 기능도 많아. 어서 사용해보자! 🚀