Products
인터페이스

Lua 5.1 초급 자습서

게시일
2025/04/10 10:10
작성자
태그
자습서

1. 시작하기 전에

루아(Lua)란 무엇일까요?
루아는 다양한 종류의 프로그래밍 작업을 지원하도록 설계된 확장 프로그래밍 언어입니다. 특히, 데이터 기술 기능을 갖춘 일반적인 절차적 프로그래밍을 용이하게 하며, 객체 지향 프로그래밍, 함수형 프로그래밍, 데이터 주도 프로그래밍에 대한 훌륭한 지원을 제공합니다. 루아의 주요 목적은 강력하면서도 가벼운 스크립팅 언어로서, 스크립팅 기능이 필요한 모든 프로그램에 통합될 수 있도록 하는 것입니다. 실제로 루아는 깨끗한 C 언어 (ANSI C와 C++의 공통 부분집합)로 작성된 라이브러리 형태로 구현되어 있습니다. 확장 언어로서 루아는 독립적인 "메인" 프로그램의 개념을 가지고 있지 않습니다. 대신, "임베딩 프로그램" 또는 간단히 "호스트"라고 불리는 클라이언트 프로그램 내에서 작동합니다. 이 호스트 프로그램은 함수를 호출하여 루아 코드를 실행하고, 루아 변수를 읽고 쓸 수 있으며, 루아 코드에서 호출될 C 함수를 등록할 수 있습니다. C 함수를 활용함으로써 루아는 다양한 영역에 맞춰 확장될 수 있으며, 이를 통해 특정 요구 사항에 맞는 맞춤형 프로그래밍 언어를 만들 수 있습니다. 예를 들어, 게임 개발에서 게임 로직을 스크립팅하거나, 임베디드 시스템에서 특정 기능을 제어하는 데 사용될 수 있습니다. 루아 배포판에는 lua라는 샘플 호스트 프로그램이 포함되어 있는데, 이 프로그램은 루아 라이브러리를 사용하여 완전한 독립 실행형 루아 인터프리터를 제공합니다. 루아는 무료 소프트웨어이며, 라이선스에 명시된 대로 어떠한 보증도 없이 제공됩니다. 이 자습서에서는 Lua 5.1 버전을 기준으로 기본적인 문법과 개념을 쉽게 설명하여, 프로그래밍 경험이 없거나 루아를 처음 접하는 사용자도 루아 프로그래밍을 시작할 수 있도록 돕는 것을 목표로 합니다.
개발 환경 준비
루아 코드를 작성하고 실행하기 위해서는 루아 인터프리터가 필요합니다. 일반적으로 루아 공식 웹사이트나 해당 운영체제의 패키지 관리자를 통해 설치할 수 있습니다. 예를 들어, 리눅스에서는 apt-get install lua5.1 또는 yum install lua와 같은 명령어를 사용할 수 있으며, 윈도우에서는 공식 웹사이트에서 제공하는 바이너리 파일을 다운로드하여 설치할 수 있습니다. 설치가 완료되면 명령줄 (터미널 또는 명령 프롬프트)에서 lua 명령어를 입력하여 루아 인터프리터를 실행할 수 있습니다. 간단한 루아 코드를 실행하는 방법은 인터프리터에 직접 코드를 입력하거나, .lua 확장자를 가진 파일에 코드를 작성한 후 인터프리터에 해당 파일 이름을 인수로 전달하는 것입니다 (예: lua my_script.lua). 좀 더 편리한 개발 환경을 위해 텍스트 편집기나 루아를 지원하는 통합 개발 환경(IDE)을 사용할 수도 있습니다. Visual Studio Code, Sublime Text, Atom 등 다양한 편집기에서 루아 문법 강조 기능을 제공하는 플러그인을 설치하여 사용할 수 있습니다.

2. 루아의 기본 개념

2.1 값과 타입
루아는 동적 타입 언어입니다. 이는 변수에 특정 데이터 타입을 명시적으로 선언할 필요가 없다는 의미입니다. 변수의 타입은 변수에 할당된 값에 따라 자동으로 결정됩니다. 루아에서는 여러 종류의 값을 다룰 수 있으며, 각 값은 고유한 타입을 가집니다.
nil: nil 타입은 값이 없음을 나타내는 특별한 값인 nil 하나만을 가집니다. 일반적으로 유효한 값이 없을 때 사용됩니다. 예를 들어, 아직 값이 할당되지 않은 변수나, 테이블에 존재하지 않는 키로 접근했을 때 nil 값이 반환될 수 있습니다. nil은 숫자 0이나 빈 문자열과는 완전히 다른 개념입니다. 숫자 0은 숫자 타입의 값이고, 빈 문자열은 문자열 타입의 값인 반면, nil은 값 자체가 없음을 의미합니다.
boolean: boolean 타입은 참(true)과 거짓(false) 두 가지 값만을 가집니다. 조건문과 같은 논리적인 판단에서 주로 사용됩니다. 루아에서 조건이 거짓으로 판정되는 경우는 false 값과 nil 값뿐이며, 이 두 가지 값을 제외한 모든 값 (숫자 0, 빈 문자열 포함)은 참으로 간주됩니다.
number: number 타입은 실수를 나타냅니다. 기본적으로 배정밀도 부동 소수점 숫자를 사용합니다. 이는 정수와 소수점 이하를 포함하는 모든 숫자를 표현할 수 있다는 의미입니다. 루아 인터프리터를 빌드할 때 단정밀도 부동 소수점 또는 정수와 같은 다른 숫자 표현 방식을 사용하도록 설정할 수도 있습니다.
string: string 타입은 문자들의 배열, 즉 문자열을 나타냅니다. 루아는 8비트 클린(8-bit clean) 속성을 가지는데, 이는 문자열이 임베디드된 0 (\0)을 포함하여 모든 8비트 문자를 포함할 수 있다는 의미입니다. 문자열 리터럴은 작은따옴표(')나 큰따옴표(")로 묶어서 표현할 수 있습니다. 예를 들어, 'hello'"world"는 모두 유효한 문자열입니다. 또한, 긴 괄호([[... ]], [=[... ]=], 등)를 사용하여 여러 줄에 걸친 문자열을 정의할 수도 있으며, 이 경우 이스케이프 시퀀스는 해석되지 않습니다. 일반적인 이스케이프 시퀀스 (예: \n - 줄 바꿈, \t - 탭)도 작은따옴표나 큰따옴표로 묶인 문자열 내에서 사용할 수 있습니다. 루아 문자열은 널 바이트 (\0)를 포함할 수 있다는 점이 다른 일부 언어와 다를 수 있습니다.
function: function 타입은 루아 코드 또는 C 코드로 작성된 함수를 나타냅니다. 루아에서 함수는 first-class 값으로 취급됩니다. 이는 함수를 변수에 할당하거나, 다른 함수의 인수로 전달하거나, 함수의 결과로 반환할 수 있다는 의미입니다.
userdata: userdata 타입은 루아 변수에 임의의 C 데이터를 저장할 수 있도록 제공됩니다. 이는 원시 메모리 블록에 해당하며, 할당 및 동일성 테스트를 제외하고 루아 자체에서는 미리 정의된 연산이 없습니다. 그러나 메타테이블을 사용하여 userdata 값에 대한 연산을 정의할 수 있습니다. userdata 값은 루아 코드 내에서 생성하거나 수정할 수 없으며, C API를 통해서만 가능합니다. 이는 호스트 프로그램이 소유한 데이터의 무결성을 보장합니다.
thread: thread 타입은 독립적인 실행 스레드를 나타내며, 코루틴을 구현하는 데 사용됩니다. 루아 스레드는 운영체제 스레드와는 다른 개념입니다. 루아는 스레드를 지원하지 않는 시스템에서도 코루틴을 지원합니다. 코루틴은 특정 시점에서 실행을 일시 중단하고 나중에 재개할 수 있는 함수입니다.
table: table 타입은 연관 배열을 구현합니다. 이는 숫자뿐만 아니라 nil을 제외한 모든 값으로 인덱싱할 수 있는 배열입니다. 테이블은 다양한 타입의 값을 포함할 수 있으며, 루아에서 유일한 데이터 구조 메커니즘입니다. 일반적인 배열, 심볼 테이블, 집합, 레코드, 그래프, 트리 등을 표현하는 데 사용될 수 있습니다. 레코드를 표현하기 위해 루아는 필드 이름을 인덱스로 사용하며, a.namea["name"]의 syntactic sugar입니다. 테이블은 중괄호 {}를 사용하여 생성하며, 키-값 쌍으로 데이터를 저장합니다. 테이블은 루아에서 매우 중요한 개념이며, 다양한 용도로 활용됩니다.
type() 함수는 주어진 값의 타입을 설명하는 문자열을 반환합니다. 예를 들어, type(10)"number"를, type("hello")"string"을 반환합니다.
2.2 변수
변수는 값을 저장하는 명명된 장소입니다. 루아에서 변수 이름 (identifier)은 글자, 숫자, 밑줄(_)로 구성될 수 있으며, 숫자로 시작할 수 없습니다. 변수 이름으로 예약어(keywords)를 사용할 수 없습니다. 루아는 대소문자를 구분하므로, myVariablemyvariable은 서로 다른 변수로 취급됩니다.
Key Table 2: Lua 예약어
and
break
do
else
elseif
end
false
for
function
if
in
local
nil
not
or
repeat
return
then
true
until
while
Sheets로 내보내기
일반적으로 밑줄(_)로 시작하고 대문자가 이어지는 이름 (예: `_VERSION`)은 루아 내부에서 사용하는 전역 변수를 위해 예약되어 있습니다.[1] 사용자는 이러한 명명 규칙을 피하는 것이 좋습니다. 루아에서는 전역 변수와 지역 변수가 있습니다. 명시적으로 `local` 키워드를 사용하여 선언하지 않은 변수는 모두 전역 변수로 간주됩니다.[1] 전역 변수는 프로그램 어디에서든 접근할 수 있습니다. 반면, 지역 변수는 `local` 키워드를 사용하여 선언되며, 선언된 블록 (예: 함수 내부, `do... end` 블록) 내에서만 유효합니다.[1] 지역 변수는 자신이 선언된 스코프 내에서 정의된 함수에 의해 자유롭게 접근될 수 있습니다.[1] 일반적으로 지역 변수를 사용하는 것이 권장됩니다.[2] 이는 코드의 가독성을 높이고, 변수 이름 충돌을 방지하며, 때로는 성능 향상에도 도움이 될 수 있습니다. 변수에 처음으로 값을 할당하기 전에는 그 값은 `nil`입니다.[1] 루아는 다중 할당을 지원합니다. 이를 통해 한 번의 명령으로 여러 변수에 값을 할당할 수 있습니다.[1] 할당문의 왼쪽에는 변수 목록이 쉼표로 구분되어 오고, 오른쪽에는 표현식 목록이 쉼표로 구분되어 옵니다. 할당이 이루어지기 전에 값 목록의 길이가 변수 목록의 길이에 맞춰 조정됩니다. 필요한 값보다 더 많은 값이 있는 경우 초과 값은 버려지고, 필요한 값보다 적은 값이 있는 경우 부족한 만큼 `nil`로 채워집니다.[1]
2.3 연산자
루아는 다양한 연산을 수행하기 위한 여러 종류의 연산자를 제공합니다.
산술 연산자: 일반적인 산술 연산을 수행하는 연산자로는 덧셈(+), 뺄셈(), 곱셈(), 나눗셈(/), 나머지(%), 거듭제곱(^)이 있으며, 단항 연산자인 음수 부호 변경()도 있습니다. 이러한 연산자는 숫자 또는 숫자로 변환될 수 있는 문자열에 적용될 수 있습니다. 루아는 문자열에 산술 연산을 적용하려고 할 때, 일반적인 변환 규칙에 따라 해당 문자열을 숫자로 변환하려고 시도합니다. 나머지 연산자 a % ba - math.floor(a/b)*b로 정의됩니다.
관계 연산자: 두 값을 비교하는 연산자로는 같음(==), 같지 않음(~=), 작음(<), 큼(>), 작거나 같음(<=), 크거나 같음(>=)이 있습니다. 이러한 연산자의 결과는 항상 false 또는 true입니다. 같음 연산자(==)는 먼저 피연산자의 타입을 비교합니다. 타입이 다르면 결과는 false입니다. 그렇지 않으면 피연산자의 값을 비교합니다. 숫자와 문자열은 일반적인 방식으로 비교됩니다. 테이블, userdata, 스레드, 함수와 같은 객체는 참조로 비교됩니다. 즉, 두 객체가 동일한 객체인 경우에만 같다고 간주됩니다. "0" == 0은 타입이 다르므로 false로 평가됩니다.
논리 연산자: 논리 연산을 수행하는 연산자로는 and(논리곱), or(논리합), not(논리 부정)이 있습니다. 제어 구조와 마찬가지로, 논리 연산자는 falsenil을 거짓으로 간주하고, 그 외의 모든 값은 참으로 간주합니다. not 연산자는 항상 false 또는 true를 반환합니다. and 연산자는 첫 번째 피연산자가 false 또는 nil이면 첫 번째 피연산자를 반환하고, 그렇지 않으면 두 번째 피연산자를 반환합니다. or 연산자는 첫 번째 피연산자가 nilfalse가 아니면 첫 번째 피연산자를 반환하고, 그렇지 않으면 두 번째 피연산자를 반환합니다. andor는 모두 단축 평가를 사용합니다. 즉, 필요한 경우에만 두 번째 피연산자를 평가합니다.
문자열 연결 연산자: 문자열을 연결하는 연산자는 두 개의 점 (..)으로 표시됩니다. 두 피연산자가 모두 문자열 또는 숫자이면, §2.2.1에 언급된 규칙에 따라 문자열로 변환됩니다.
길이 연산자: 문자열 또는 테이블의 길이를 얻는 데 사용되는 단항 연산자는 #입니다. 문자열의 길이는 바이트 수이며, 테이블 t의 길이는 t[n]nil이 아니고 t[n+1]nil인 정수 인덱스 n으로 정의됩니다. 또한, t nil이면 n은 0이 될 수 있습니다. 만약 배열에 1부터 주어진 n까지 nil이 아닌 값이 순차적으로 있다면, 그 길이는 정확히 n입니다. 배열에 "구멍" (즉, nil 값이 다른 nil이 아닌 값 사이에 있는 경우)이 있으면, #tnil 값 바로 앞에 있는 인덱스 중 하나가 될 수 있습니다.
연산자 우선순위: 루아에서 연산자 우선순위는 다음과 같습니다 (낮은 우선순위부터 높은 우선순위 순): or, and, <, >, <=, >=, ~=, ==, .., +, , , /, %, not, #, (단항), ^. 일반적인 규칙과 같이 괄호를 사용하여 표현식의 우선순위를 변경할 수 있습니다. 연결 연산자 (..)와 거듭제곱 연산자 (^)는 오른쪽 결합성을 가지며, 나머지 모든 이항 연산자는 왼쪽 결합성을 가집니다.
Key Table 3: Lua 연산자 우선순위
우선순위
연산자
결합성
1
or
왼쪽
2
and
왼쪽
3
<, >, <=, >=, ~=, ==
왼쪽
4
..
오른쪽
5
+, -
왼쪽
6
*, /, %
왼쪽
7
not, #, - (단항)
오른쪽
8
^
오른쪽
Sheets로 내보내기

3. 프로그램의 흐름 제어

3.1 조건문LuaLuaLua
루아는 조건에 따라 코드 블록을 실행하는 if 문을 제공합니다. 가장 기본적인 형태는 다음과 같습니다.
if 조건 then -- 조건이 참일 경우 실행될 코드 end
if 조건이 참이면 then 키워드와 end 키워드 사이의 코드 블록이 실행됩니다. if 조건이 거짓일 경우 특정 코드를 실행하고 싶다면 else 키워드를 사용할 수 있습니다.
if 조건 then -- 조건이 참일 경우 실행될 코드 else -- 조건이 거짓일 경우 실행될 코드 end
여러 조건을 순차적으로 확인해야 하는 경우에는 elseif 키워드를 사용할 수 있습니다.
if 조건1 then -- 조건1이 참일 경우 실행될 코드 elseif 조건2 then -- 조건1은 거짓이고 조건2가 참일 경우 실행될 코드 else -- 모든 조건이 거짓일 경우 실행될 코드 end
if 문의 조건 표현식은 어떤 값이든 반환할 수 있습니다. 루아에서는 false 값과 nil 값만이 거짓으로 취급되며, 그 외의 모든 값 (숫자 0, 빈 문자열 포함)은 참으로 간주됩니다.
3.2 반복문
루아는 특정 조건이 만족되는 동안 코드 블록을 반복적으로 실행하는 여러 종류의 반복문을 제공합니다.
while 문: 주어진 조건이 참인 동안 코드 블록을 계속 실행합니다.Lua
while 조건 do -- 조건이 참인 동안 반복해서 실행될 코드 end
repeat-until 문: 코드 블록을 먼저 실행한 후 조건을 확인합니다. 조건이 참이 될 때까지 코드 블록을 반복합니다.Lua
repeat -- 반복해서 실행될 코드 until 조건
repeat-until 루프에서는 while 루프와 달리 조건이 루프 본문이 실행된 후에 평가됩니다. 따라서 repeat 블록 안의 코드는 최소한 한 번은 실행됩니다. 또한, repeat 블록 내에서 선언된 지역 변수는 until 조건에서도 접근할 수 있습니다.
for 문: 루아는 두 가지 형태의 for 문을 제공합니다.
Numeric for loop: 특정 범위의 숫자를 순회하며 코드 블록을 반복 실행합니다.Lua
for 변수 = 시작값, 종료값 [, 증감값] do -- 반복해서 실행될 코드 end
시작값부터 종료값까지 (종료값 포함) 변수의 값을 증감값만큼 증가시키면서 코드 블록을 반복합니다. 증감값을 생략하면 기본값은 1입니다. 루프 변수는 for 루프 내에서만 유효하며, 루프가 종료된 후에는 그 값을 사용할 수 없습니다.
Generic for loop: 반복자(iterator)라고 불리는 함수를 사용하여 컬렉션을 순회하며 코드 블록을 반복 실행합니다.Lua
for 변수1, 변수2,... in 반복자 do -- 반복해서 실행될 코드 end
가장 흔히 사용되는 반복자는 pairs()ipairs() 함수입니다. ipairs()는 배열 형태의 테이블 (숫자 키로 순차적으로 인덱싱된 테이블)을 순회하는 데 사용되며, 인덱스와 값을 순서대로 반환합니다. 반면, pairs()는 테이블의 모든 키-값 쌍을 순회하며, 키의 순서는 보장되지 않습니다. pairs()는 숫자 키뿐만 아니라 문자열 키도 포함한 모든 키-값 쌍을 순회하는 데 유용합니다. pairs()는 내부적으로 next 함수를 사용하여 테이블을 순회하는 반면, ipairs()는 1부터 시작하는 순차적인 숫자 인덱싱을 가정합니다.
break 문: while, repeat, for 루프의 실행을 즉시 종료하고 루프 다음의 문으로 건너뛰는 데 사용됩니다. break 문은 가장 안쪽의 감싸는 루프를 종료합니다. return 문과 마찬가지로, break 문은 블록의 마지막 문으로만 작성될 수 있습니다. 만약 블록 중간에서 break를 사용해야 한다면, do break end와 같이 명시적인 내부 블록을 사용할 수 있습니다.

4. 함수

4.1 함수 정의LuaLuaLua
루아에서 함수를 정의하는 기본적인 방법은 function 키워드를 사용하는 것입니다. 함수 정의는 다음과 같은 구문을 가집니다.
function 함수이름(매개변수1, 매개변수2,...)-- 함수 본문 end
함수 이름은 함수를 호출할 때 사용되며, 매개변수는 함수가 호출될 때 전달되는 값을 받기 위한 변수 목록입니다. 함수 본문은 함수가 수행할 코드를 포함합니다.
루아에서는 익명 함수를 생성하여 변수에 할당할 수도 있습니다.
myFunction = function(x, y)return x + y end
local 키워드를 사용하여 지역 함수를 정의할 수도 있습니다. 지역 함수는 자신이 정의된 스코프 내에서만 접근할 수 있습니다.
local function myLocalFunction(n)return n * 2 end
function f () body endf = function () body end로, function t.a.b.c.f () body endt.a.b.c.f = function () body end로, local function f () body endlocal f; f = function () body end로 번역됩니다. 특히, local function f () body endlocal f = function () body end와는 다릅니다. 전자는 함수 본문 내에서 f를 참조할 수 있도록 하지만, 후자는 함수 본문이 평가될 때까지 f가 정의되지 않습니다.
함수 정의는 실행 가능한 표현식이며, 그 값은 function 타입입니다.
4.2 함수 호출Lua
함수를 호출하려면 함수 이름 뒤에 괄호 안에 인수(arguments)를 전달합니다.
result = myFunction(10, 20)
함수 호출 시 인수의 개수는 함수 정의 시 정의된 매개변수의 개수와 일치하지 않아도 됩니다. 인수가 매개변수보다 많으면 초과 인수는 무시되고, 인수가 매개변수보다 적으면 부족한 매개변수는 nil 값을 갖게 됩니다.
함수 호출 시 몇 가지 편의 문법이 제공됩니다. 만약 함수의 인수가 테이블 생성자 하나뿐이라면 괄호를 생략할 수 있습니다. 예를 들어, f{a=1, b=2}f({a=1, b=2})와 같습니다. 마찬가지로, 함수의 인수가 문자열 리터럴 하나뿐이라면 괄호를 생략할 수 있습니다. 예를 들어, print "hello"print("hello")와 같습니다. 하지만 함수 호출의 ( 앞에 줄 바꿈을 넣을 수는 없습니다. 예를 들어, a = f (g).x(a)a = f(g).x(a)와 같이 한 문장으로 해석됩니다.
메서드 호출 구문 v:name(args)v.name(v,args)의 syntactic sugar입니다. 단, v는 한 번만 평가됩니다. 이는 객체 지향 프로그래밍에서 메서드를 호출하는 데 편리하게 사용됩니다.
return functioncall 형태의 함수 호출을 꼬리 호출(tail call)이라고 합니다. 꼬리 호출은 특정 구문, 즉 return 뒤에 단일 함수 호출이 오는 경우에만 발생합니다. 꼬리 호출은 스택 공간을 추가로 소비하지 않으므로, 재귀 함수 호출을 효율적으로 처리할 수 있게 합니다.
4.3 함수 매개변수
함수 정의 시 매개변수 목록은 함수가 받을 인수의 이름을 지정합니다. 루아는 가변 인자 함수를 지원합니다. 함수 정의 시 마지막 매개변수를 세 개의 점 (...)으로 지정하면, 함수가 호출될 때 전달된 추가 인수를 모두 받을 수 있습니다. 이러한 추가 인수는 함수 내에서 ... 표현식을 통해 접근할 수 있으며, 여러 개의 결과를 반환하는 함수와 유사하게 처리됩니다.
4.4 함수 반환 값
함수는 return 문을 사용하여 결과를 반환할 수 있습니다. 함수는 하나 이상의 값을 반환할 수 있습니다. return 문이 없이 함수의 끝에 도달하면 함수는 아무런 값도 반환하지 않고 종료됩니다.

5. 루아 자료 구조: 테이블

5.1 테이블 생성LuaLuaLua
루아에서 테이블은 중괄호 {}를 사용하여 생성됩니다. 빈 테이블은 단순히 {}로 표현할 수 있습니다. 테이블을 생성하면서 초기 값을 지정할 수도 있습니다. 배열 형태로 테이블을 생성할 때는 값을 쉼표로 구분하여 나열합니다. 이때, 테이블의 인덱스는 기본적으로 1부터 시작합니다.
myArray = {10, 20, 30} print(myArray[1]) -- 출력: 10
딕셔너리 형태로 테이블을 생성할 때는 키-값 쌍을 지정합니다. 키와 값은 = 기호로 연결하고, 각 쌍은 쉼표로 구분합니다.
myDictionary = {name = "Alice", age = 30} print(myDictionary["name"]) -- 출력: Alice print(myDictionary.age) -- 출력: 30 (syntactic sugar)
테이블 생성 시 배열 형태와 딕셔너리 형태를 혼합하여 사용할 수도 있습니다.
mixedTable = {10, name = "Bob", 20, age = 25} print(mixedTable[1]) -- 출력: 10 print(mixedTable.name) -- 출력: Bob print(mixedTable) -- 출력: 20 print(mixedTable["age"]) -- 출력: 25
5.2 테이블 접근 및 조작LuaLua
테이블의 요소에 접근하려면 테이블 이름 뒤에 대괄호 ``를 사용하여 인덱스나 키를 지정합니다. 숫자 인덱스는 배열처럼 사용하며, 문자열 키는 딕셔너리처럼 사용합니다. 문자열 키가 유효한 식별자인 경우 점(.) 표기법을 사용하여 접근할 수도 있습니다.
myTable = {} myTable[1] = "apple" myTable["color"] = "red" print(myTable[1]) -- 출력: apple print(myTable["color"]) -- 출력: red print(myTable.color) -- 출력: red
테이블에 새로운 값을 추가하거나 기존 값을 수정하는 방법은 값을 할당하는 것과 같습니다. 테이블에서 값을 삭제하려면 해당 키에 nil을 할당하면 됩니다.
myTable.weight = 1.2 -- 추가 myTable[1] = "banana" -- 수정 myTable.color = nil -- 삭제
5.3 테이블 관련 함수
루아의 표준 라이브러리는 테이블을 조작하기 위한 여러 함수를 제공합니다.
table.insert(table, [pos,] value): 테이블의 지정된 위치(pos)에 값(value)을 삽입합니다. pos를 생략하면 테이블의 마지막에 삽입됩니다.
table.remove(table, [pos]): 테이블의 지정된 위치(pos)에 있는 요소를 제거하고 제거된 요소를 반환합니다. pos를 생략하면 테이블의 마지막 요소를 제거합니다.
table.sort(table, [comp]): 테이블의 요소를 정렬합니다. 선택적으로 비교 함수(comp)를 제공하여 정렬 방식을 지정할 수 있습니다.
table.concat(table, [sep, [i, [j]]]): 테이블의 요소들을 문자열로 연결합니다. 선택적으로 요소 사이에 삽입할 구분자(sep)와 연결할 요소의 범위(i부터 j까지)를 지정할 수 있습니다.
# 연산자를 사용하여 테이블의 길이를 확인할 수 있으며, pairs()ipairs() 함수를 사용하여 테이블의 모든 요소를 순회할 수 있습니다.

6. 루아 표준 라이브러리

6.1 기본 함수
루아는 여러 기본 함수를 제공합니다.
print(...): 주어진 인수를 문자열로 변환하여 표준 출력으로 출력합니다.
type(v): 주어진 값 v의 타입을 나타내는 문자열을 반환합니다.
tonumber(e [, base]): 인수 e를 숫자로 변환하려고 시도합니다. 선택적으로 기수(base)를 지정할 수 있습니다.
tostring(v): 주어진 값 v를 사람이 읽을 수 있는 문자열 표현으로 변환합니다.
assert(v [, message]): 값 v가 거짓(false 또는 nil)이면 오류를 발생시킵니다. 선택적으로 오류 메시지를 지정할 수 있습니다.
error(message [, level]): 오류를 발생시킵니다. 오류 메시지와 발생 위치 레벨을 지정할 수 있습니다.
pcall(f [, arg1,...]): 보호된 모드에서 함수 f를 주어진 인수와 함께 호출합니다. 오류가 발생해도 프로그램을 종료시키지 않고 오류 상태와 메시지를 반환합니다.
xpcall(f, msgh [, arg1,...]): pcall과 유사하지만, 오류 발생 시 호출할 사용자 정의 오류 처리기(msgh)를 지정할 수 있습니다.
6.2 문자열 조작 라이브러리
루아는 문자열을 다루기 위한 다양한 함수를 제공하는 string 라이브러리를 포함합니다. 초급 과정에서는 string.len(s) (문자열 길이), string.sub(s, i [, j]) (부분 문자열 추출), string.find(s, pattern [, init [, plain]]) (패턴 검색), string.format(formatstring,...) (형식화된 문자열 생성) 정도를 알아두면 유용합니다.
6.3 테이블 조작 라이브러리
테이블 조작 라이브러리는 이미 5장에서 다루었습니다.
6.4 수학 라이브러리
math 라이브러리는 수학 관련 함수를 제공합니다. 초급 과정에서는 math.random() (난수 생성), math.floor(x) (내림), math.ceil(x) (올림), math.abs(x) (절댓값), math.sin(x), math.cos(x) (삼각 함수) 등을 활용할 수 있습니다.
6.5 입출력 라이브러리
io 라이브러리는 파일 입출력 기능을 제공합니다. 기본적인 사용법으로는 io.open(filename [, mode]) (파일 열기), file:read(...) (파일 읽기), file:write(...) (파일 쓰기), file:close() (파일 닫기) 등이 있습니다.

7. 요약

이 자습서에서는 Lua 5.1 프로그래밍 언어의 기본적인 개념들을 다루었습니다. 1장에서는 루아의 특징과 개발 환경 설정 방법을 소개했습니다. 2장에서는 루아의 기본적인 값 타입, 변수, 그리고 다양한 연산자들에 대해 학습했습니다. 3장에서는 프로그램의 흐름을 제어하는 조건문과 반복문에 대해 알아보았습니다. 4장에서는 함수를 정의하고 호출하는 방법, 매개변수와 반환 값에 대해 설명했습니다. 5장에서는 루아의 핵심 자료 구조인 테이블을 생성하고 조작하는 방법을 배웠습니다. 마지막으로 6장에서는 루아 표준 라이브러리의 기본적인 사용법을 간략하게 소개했습니다.

8. 연습 문제

1.
두 개의 숫자를 입력받아 그 합을 출력하는 루아 스크립트를 작성하세요.
2.
1부터 10까지의 숫자를 출력하는 while 루프를 작성하세요.
3.
주어진 숫자가 짝수인지 홀수인지 판별하는 함수를 작성하고 호출하세요.
4.
이름과 나이를 키-값 쌍으로 저장하는 테이블을 만들고, 이름과 나이를 출력하세요.
5.
math.random() 함수를 사용하여 1부터 100 사이의 임의의 숫자를 생성하고 출력하세요.

9. 결론

루아는 배우기 쉽고 강력한 스크립팅 언어입니다. 이 자습서를 통해 루아 프로그래밍의 기본적인 개념을 이해하고 간단한 프로그램을 작성할 수 있게 되었기를 바랍니다. 앞으로 더 많은 예제와 실습을 통해 루아 프로그래밍 능력을 향상시키고, 다양한 분야에서 루아를 활용해 보시기를 권장합니다. 더 심도 있는 학습을 위해서는 Lua 5.1 Reference Manual과 같은 공식 문서를 참고하는 것이 좋습니다.