본문 바로가기

3.구현/Lua

1. 루아 스크립트 기초

작성자: Ospace (ospace114@empal.com) http://ospace.tistory.com

루아(Lua)에 대해서

일단 루아가 무엇인지 간략하게 알아보자.[1]
루아는 프로그램에 내장되는 스크립트이다. 혹은 임베드 스크립트라고도 한다. 물론 일반적인 스크립트 처럼 바로 실행도 가능하지만, 그렇게는 많이 사용하지 않는다.

장점

메인 프로그램과 서로 호출이 가능하며 데이터 교환도 가능하다. 특히 C언어에 이식하기 쉽다. 그래서 만들고자 하는 메인 프로그램 기능 중에 일부를 루아 스크립트로 별도로 빼어내어 구현하고 이를 메인 프로그램에서 호출가능하다. 스크립트 언어의 장점으로 쉽게 수정해서 붙일 수 있기 때문에 스크립트를 이용해서 기능을 구현할 경우 전체 프로젝트를 새로 컴파일할 필요가 없이 스크립트 수정으로 쉽게 적용 가능하다.
사실 이 부분은 기존 프로그램의 모듈화에 의해서 상호 인터페이스만 정해주면 되는 것과 같다.

다른 장점으로 비슷한 스크립트 언어보다 속도가 빠르고 크기가 작다. 이건 뭐 당연한 건가? 기능이 많이 제공되면 그만큼 크기가 커지고 속도가 느려진다. 대표적인 것이 Python?

문법이 쉽다. VBScript와 같은 느낌이다.

단점

가비지 콜랙션이 마음대도 되지 않은다. 이건 Java에서도 나타나는 문제로서 프로그래머가 어느정도 제어할 수 있게 해야되는데 루아에서도 가능하다. (버전 5.0이후)

아직 제공되는 리소스가 풍부하지 않다. 다른 잘나가는 스크립트에 비해서..

그래서 사용하는 목적에 따라서 루아를 선택하면 된다. 즉, 많은 기능이 필요하고 프로그램이 대부분의 기능이 스크립트 중심으로 짜여진다면 Python같은 스크립트 언어를 사용하는게 좋으며, 빠른 속도와 작은 크기가 필요하고, 프로그램 일부에서만 사용된다면 루아를 강추한다는 말이다.

내장 스크립트를 쓰는 이유

인터넷에서 내장 스크립트를 쓰는 이유에 대한 재미난 글을 읽었다.[4] 최근 루아가 게임에 많이 쓰이고 있으므로 게임을 대상으로 설명하였다.

짜잔~ RPG에서 스크립트 언어~
일반 RPG게임에 등장하는 아주 기본적인 아이템인 포션의 속성을 살펴보면
ex) 이름, 가격, 형태, 효력

예를 들어 체력을 체워주는 포션을 힐링포션이라고 하면,
ex) 이름 = 힐링포션 레벨1, 가격 = 150, 형태 = 힐링, 효력 = 50

형태로 초기화 할 수 있다. 그런데 효력 50이 실제 게임을 하다보니 효과가 너무 미비하여 수치를 올리려고 한다. 그래서 100으로 수정했다. 만약 일반 프로그램으로만 제작되었다면 새로 빌드하여야 하지만 스크립트 분리되었다면 그냥 수정만 해주면 된다. 즉, 하드코딩 작업은 그리 효율적이지 않다.

사실 위의 부분은 환경파일로 따로 분리하여 초기화하거나 혹은 다른 리소스 모듈로 빼어내어 간단히 빌드해서 사용할 수 있다. 단순 변수 값 변경으로 인한 부분으로만 스크립트를 사용해야되다는 논리는 조금 약한것 같다. 사실 나도 이제 막 시작하는 입장이라서 딱히 뭐라고 하지는 못하지만 말이다. 조금 더 생각하면 새로운 로직을 구성해서 넣을 수 있다는 장점을 생각하게 더 좋지 않을까한다.

루아 들어가기

먼저 루아에 스크립트 대해 기본을 먼저 살펴보고, 그 다음에 좀더 깊이 들어가겠다.
그런 후에 다른 프로그램과 호출 (주로 C언어나 C++이겠지만)하는 법을 살펴보겠다. 이런 호출은 프로그램이 Lua에 기능을 호출하는 것과 Lua에서 프로그램 기능을 호출하는 것으로 구분된다.

  1. 루아 스크립트
  2. 기본기 다지기
  3. 전문가 되기
  4. 루아 상호작용
  5. 루아를 호출하기
  6. 루아에서 호출하기

기본기 다지기

자료형

먼저 데이터 형을 보자. C언어 처럼 데이터 형을 사용하지 않은다. 그냥 단순히 데이터 대입만으로 된다.

<ex_01.lua>

a = 1
b = "123abc"
c = nil
print(a)
print(b)
print(c)

<결과>

1  
123abc  
nil  

변수 a는 숫자형이 되고, 변수 b는 문자열이 되며, 변수 c는 nil이라고 C언어의 NULL과 비슷한 값이 된다. 그리고 변수 a가 숫자형으로 되어 있지만 문자열로도 저장이 가능하다. 그때그때 마다 알아서 자료형을 관리해준다.
print()는 넘겨받은 내용을 화면 콘솔상에 출력하는 함수로서 C언어의 printf와 비슷하다.

print "Lua script"    -- 문자열 출력 가능
print 1111            -- 숫자 출력 에러
print ("Lua script")  -- 문자열 출력 가능
print (1111)          -- 숫자 출력 가능

괄호 없이 사용가능 하나 이는 문자열인 경우만 가능하다. "--"은 주석이다.
현재 변수의 자료형을 알고 싶다면 type()을 사용하면 된다. 문자열로 데이터 형을 표시한다.

<ex_02.lua>

a = 1
b = "123abc"
c = nil

print(type(a))
print(type(b))
print(type(c))

<결과>

number  
string  
nil  

type() 함수는 함수도 알수 있으며, 테이블 형도 알 수 있다. 테이블 형은 배열과 비슷하다고 보면된다. 그러나 그보다 더 유연하며 함수도 포함 가능하다. 어찌보면 C언어의 구조체 처럼 보이지마, 형태는 배열에 더 가깝다. 함수는 그냥 함수다.

테이블 형에 대해서 간략하게 살펴보겠다. 테이블 형은 따로 형 선언이 없고 중괄호"{ }"를 사용하면 모두 테이블 형이 된다.

<ex_03.lua>

fruit = { 11, 22, "aa" }

print (fruit[1])
print (fruit[2])
print (fruit[3])

<결과>

11  
22  
aa  

주의!!! 루아에서 테이블 인덱스는 0이 아닌 1에서 시작한다. C언에서는 배열 인덱스는 0에서 시작하는 것과 다르다.

위와 같이 테이블을 사용했을 경우는 배열과 똑같다고 생각이 든다. 데이블 형은 유연해서 변수가 내부 객체로 추가할 수 있으며, 나중에 새로운 값을 새로 추가할 수도 있다.

<ex_04.lua>

fruit = { 11, 22, "aa", name="apple" }

print (fruit[1])
print (fruit[2])
print (fruit[3])
print (fruit[4])
print (fruit.name)

fruit.number = 100

print (fruit.name, fruit.number)
print (fruit["number"])

<결과>

11  
22  
aa  
nil  
apple  
apple 100  
100  

단 주의할 것은 일반 값 들은 배열 인덱스 처럼 fruit[1]와 같이 참조가 가능하지만 fruit[4]와 같이 하면 nil로 값이 없음을 의미한다. 그때에서 직접 이름을 적어서 참조해야한다.
혹은 대괄호("[ ]") 안에 문자열 형태로("number") 입력해서 참조할 수도 있다.

fruit = { 11, 22, "aa", ["name"]="apple" } -- 앞의 예제와 같은 의미

테이블이 약간 복잡할 수도 있지만 루아에서 상당히 중요한 자료형이기 때문에 반드시 숙지하고 넘어가야한다.
마지막으로 자료형에 대해서 조금더 살펴보고 넘어가겠다.

여러 변수 동시 초기화

동시에 여러 변수를 같이 초기화할 수 있다. 양쪽 개수로 서로 다를 경우가 있다. 왼쪽 변수가 많다면, 채워지지 않은 변수는 nil로 입력된다. 만약 오른쪽 값이 많다면 변수에 채워지고 남은 값은 버려지게 된다.

a, b = "100", 5
print(a, b)

<결과>

100   5  

변수 교환, 스왑

C언어나 다른 언어를 해봤다면 두 변수의 값을 서로 교환하는 스왑을 구현하는 경우 다음과 같이 하였을 것이다.

t = a;
a= b;
b = t;

Lua에서는 더욱 간변한 작업을 제공한다. 앞의 여러 변수 초기화 하는 방법을 알면 쉽게 가능하다.

a, b = b, a  

자동 자료형 변환

숫자와 문자 간에 연산이 필요한 경우 Lua에서는 자동을 값을 변환해서 처리한다.
단, 다음 조건을 어겨서는 안된다.

  • 문자에서 숫자로 변환시 문자열은 전부 숫자로 구성되어야 한다.
a, b = "100", 5
c = "1a"

d = a - b  -- OK
e = b - a  -- OK
f = c - b   -- Error
g = b - c  -- Error

print(d, e)

<결과>

95 -95  

그냥 실행이 안되는데 이는 f와 g에 대한 계산 에러가 발생했기 때문에 수정이 필요하다.

간단한 문자열 처리

두개의 문자열 합하는 것은 ".." 마침표 두개를 사용한다. 값이 숫자이면 자동으로 문자로 변경한다.

a, b = "1a", 5
c = a .. b
d = b .. a

print(c, d)

<결과>

1a5 51a  

이 정도로 해서 루아의 자료형에 대해 간략하게 알아보았다.

참조

[1]http://www.lua.org
[2]http://www.redloop.com/larsde/articles/lua.php
[3]http://www.redwiki.net/wiki/wiki.php/LUA%20%C6%A9%C5%E4%B8%AE%BE%F3
[4]http://www.devmaster.net/articles/lua/lua1.php

반응형

'3.구현 > Lua' 카테고리의 다른 글

4. Lua의 조건문 반복문  (0) 2008.01.21
3. Lua의 각종 연산자들  (0) 2007.07.23
2. Lua 함수에 대해서  (0) 2007.07.20
루아의 BNF  (0) 2007.07.19
Lua 시작하기  (0) 2007.07.13