반응형

일단 Dictionary 란 무엇인가를 알아보도록 하죠.

STL 을 아시는 분은 map 같은 것이죠.

 

Java, C# 등에서도 제공 됩니다.

 

언듯 들으면 전자사전? 정도로 생각할 수 있습니다. 의미적으로 비슷합니다.

프로그램을 만드는데 있어서 dictionary 라는것이 무엇인지 알아보도록 하죠.

 

가령 우리가 전국 지역번호(전화의) 를 참조하는 것이 필요하다고 할때,

 

지역번호는 정해져 있습니다. 즉 바뀌기 어렵죠. 다만 그 값을 사용하는것이 매우 빈번 하게 발생 합니다.

즉 어떠한 정보가 있으면 정보의 내용을 갱신하는 빈도와 , 그 정보들중 필요한 것을 찾아 사용하는 것의 방법으로

정보에 접근하는 형태가 나뉘어 집니다.

이는 우리가 영어사전이 그 내용자체는 바뀌는것이 드물며(어떤 정보는 평생 변하지 않을수도 있음) 단지 모르는 영어단어를

찾아보는 경우가 훨씬 많다는 것 입니다.

 

이러한 경우에 우리는 이러한 정보를 위의 사용에 보다 효과적으로 대처할 수 있도록 자료들을 보관하는 방법을 찾습니다.

이러한 경우에 사용하는 방법이 dictionary 입니다. 일종의 자료구조의 하나이지요.

 

루아에서 이러한 dictionary 형태를 table 을 이용하여 만들 수 있습니다.

 

아래의 정보가 있다고 생각해 봅니다.

 

서울 = 02

경기 = 031

인천 = 032

강원 = 033

부산 = 051

충남 = 041

대전 = 042

제주 = 064

 

지역번호는 더 많지만 일단 이것으로...

 

C에서 배열 또는 리스트로 위의 내용을 저장하여

만일 충남의 지역번호는? 이란 질문이 들어올때 배열을 쭉 찾아서 충남이 나올때까지 돌려 해당 값을 찾겠죠.

아니면 STL 의 map 과 같은 형태로 코딩을 할 수 있겠죠?

 

루아에서는 테이블을 이용합니다.

 

ddd = {["서울"]="02", ["경기"]="031", ["인천"]="032", ["강원"]="033", ["부산"]="051", 
      ["충남"]="041", ["대전"]="042", ["제주"]="064" }

 

print(ddd["제주"])
print(ddd["서울"])

 

이렇게 검색할 수 있다는 것 입니다.

 

여기서 table은 table[key] = 값, 형식으로 키로 사용하는 것이 문자열일 수 있고 아니면 멤버 변수일 수 있습니다.

키가 영문자일경우는 [ ] 를 사용하지 않아도 됩니다.

 

 

ddd = {seoul="02"}


print(ddd["seoul"])

 

 

또한 아래와 같이 객체의 접근형태(c 에서의 구조체 연산자)로 접근할 수도 있습니다.

ddd = {seoul="02"}


print(ddd.seoul)

 

위와 같이 table을 이용하여 dictionary 의 구조적 문법을 사용할 수 있습니다.


종합예제:


d = {s="02", k="031", i="032", g="033", b="051", 
c="041", d="042", j="064" }



print(d.c)
print(d.s)

출력값:041
02



반응형

루아에서의 테이블은 매우 중요한 내용이다.

테이블은 매우 독특하며 그 사용면에서 광범위하다.

루아의 객체지향성을 위하여 사용되기도 한다.

 

table 생성

table명 = {}

 

예)

t = {}

테이블은 위와 같이 {} 에 의하여 초기화 된다. 그냥 table 변수를 생성한다고 보면 된다. 단 {} 로 하면 테이블로 선언 되지만 그 내용은 비어 있다고 보면 된다.

 

 

배열로서의 테이블

 

테이블을 이용하여 배열을 표현할 수 있다. 테이블을 생성할 때 배열의 각 요소들을 콤마(,) 로 구분하여 정의 할 수 있다.

또한 배열의 각 요소들은 대괄호 [ index ] 에 의하여 인덱싱되어 접근할 수 있다.

 

t = { 1,1,2,2,3,4,5,5 }

print( t[1] )

 

결과

1

 

테이블의 인덱싱은 1부터 시작한다. c/c++ 에서 배열의 첫번째 값은 인덱스 0 에 있지만 루아에서는 1에 있다.

 

t = { 1,1,2,3,5,8,13 }

은 다음과 같은 문장과 동일하다.

t[1]=1 t[2]=1 t[3]=2 t[4]=3 t[5]=5 t[6]=8 t[7]=13

테이블의 크기 알아내기

테이블의 크기는 # 연산자를 이용하여 알아낼 수 있다.

 

t = { 1,1,2,3,5,8,13 }
print(#t)

 

결과

7

참고적으로 위의 # 연산자는 다음과 같은 table 함수로 대치할 수 있다.

t = { 1,1,2,3,5,8,13 }
print(table.getn(t))

테이블에 값 추가하기

 

테이블에 다음과 같은 테이블 함수를 이용하여 값을 추가할 수 있다.

table.insert(t,21)

 

table.insert 함수는 인수가 2개 또는 3개를 사용한다.

table.insert(table,value)              -- 테이블의 끝에 추가
table.insert(table,position,value)  -- 테이블의 특정 위치에 추가

 

테이블에서 특정 위치의 값 지우기

table.remove(table,position)


반응형

보통 C 의 경우 main() 함수를 둡니다.

즉 실행파일이 만들어지고 이를 실행하면 어딘가 진입 코드부분이 있어야 겠죠.

이곳이 바로 C언어 에서의 main 함수 입니다.

 

루아는 이러한 진입 함수가 있지 않습니다.

 

그러나 이러한 단점을 보안하기 위하여 LuaWin 은 main 이라는 함수를 자동으로 호출하도록 만들었습니다.

 

function main()

 

end

 

라는 함수고 lua code에 있으면 이를 자동으로 호출해 준다고 생각하면 됩니다.

단 이는 LuaWin 에서만 적용되는 사항입니다.

또한 main 함수에 인수는 적용하지 않습니다.

 


main 함수가 있으면 특별히 호출하지 않아도 자동으로 호출 된다.

 

반응형

루아의 특징하나를 살펴봅시다.

 

루아에서는 함수도 하나의 변수 입니다.

 

다음의 예를 살펴보죠.

 

function myfunc()

print("테스트 문자열")

end

 

a = myfunc

 

a()

 

위와 같이 하면 어떻게 될까요??

a() 라는 함수 호출에 결국 myfunc() 가 호출 됩니다.

그러므로 consol 에는

 

 테스트 문자열

 

이라고 나오겠죠..

 


[루아스크립트]


반응형

프로그래밍 언어이기 때문에 변수를 사용할 수 있습니다.

 

루아에서의 변수는 선언이 필요 없습니다.

그냥 사용하면 됩니다.

 

일반적으로 C/C++ 에서는 변수를 사용하려면 변수의 형(type) 을 선언해주고 사용해야 합니다.

그러한 관점에서 루아에서는 이러한 변수의 형 선언이 필요하지 않다고 생각하시면 됩니다.

 

또한 루아에서는 변수의 형이 정해지지 않습니다. 변수에 어떠한 값을 대입하는 순간 해당 변수의

형이 변경이 됩니다.

 

다음의 예를 가지고 설명 드리겠습니다.

 

a = 10   -- a 라는 변수는 10이라는 정수를 가집니다.

a = 10.2  -- a 라는 변수는 다시 10.2 라는 실수 값을 가집니다.

a = "abcd"  -- a라는 변수는 다시 "abcd"라는 문자열을 가지는 string 변수가 됩니다.

 

참고) 루아에서는 정수,실수 구분이 없고 그냥 number 입니다. 그러므로 위의 내용은 정수라고 봐도 되고 실수라고 봐도 됩니다.

 

이렇게 a라는 하나의 변수가 그때그때 사용할때 대입되는 값에 따라서 바뀌게 됩니다.

 

C/C++ 와는 확연하게 다른 부분 입니다.

 

 

 

전역변수와 지역변수
C/C++ 프로그래밍을 하다보면 변수가 전역변수(global variable) 가 있고 지역변수(local variable) 가 있습니다.

루아에서도 이러한 개념이 준비되어 있습니다. 단 그 규칙은 다릅니다.

 

루아에서는 모든 변수가 전역 변수 입니다. 단 local 이라는 예약어에 의하여 준비된 변수는 해당 구간에서만 사용되는

지역변수로 처리 됩니다.

 

function test()

 

   a = 10 -- test 라는 함수 안에 있어소 전역 변수가 됩니다.

   local b = 20  -- b 는 지역변수로 test() 라는 함수에서만 사용됩니다.

 

end

위와 같이 지역 변수로 사용하고 싶으면 local 이라는 예약어를 변수 앞에 적어 주어야 합니다.

 

 

function testout()

print(a)

end

 

function testinit()

a = 10

end

 

testinit()

testout()

 

위와 같이 코드를 작성할 경우 출력은 10 이 나옵니다.


[루아스크립트]

반응형

어느 컴퓨터 언어 에서든 주석(comment) 문에 대한 규정이 있습니다.

루아 역시 주석문에 대한 규정이 있고 역시 다른 언어와 마찬가지로 2가지가 있습니다.

 

1. 한줄 주석

한줄 주석 (엄밀히 말하면 한줄 주석이라기 보다는 특정 위치부터 해당 라인의 끝까지만) 은

-- 를 사용 합니다. - 기호를 2개 넣으면 됩니다.

 

예)

-- 안녕하세요, 이라인은 주석으로 처리 됩니다.

 

위와 같이 -- 가 나타나면 이 이후 해당 라인의 끝까지 모두 주석으로 처리 됩니다.

 

i = 10 -- i 변수에 10 지정

 

위와 같이 수행문의 뒤에 주석으로 해당 수행문의 설명을 넣을 수도 있겠죠....

 

2. 구간 (block) 주석

프로그래밍을 하다보면 구간(block) 주석이 필요합니다.

즉 한줄로 설명하기 힘들 경우, 여러줄을 넣어 주어야 할 경우가 있거나, 또는 특정한 수행 구간을 임시로

막아, 처리하지 않도록 하는 역할로도 사용할 수 있겠죠.

 

루아의 다줄 주석은

--[[    주석 구간의 시작 으로 사용

여기는 모두 주석....

....

]] 주석 구간의 끝으로  사용

루아코드를 작성하는 경험이 있으신분들은 흔히 구간 주석을 다음과 같이 사용합니다.

 

--[[

 

--]]

 

위와 같이 할 경우 해당 주석 구간을 쉽게 풀어 버릴거나 다시 넣거나를 할 수 있기 때문입니다.

 

---[[

 

--]]

 

위와같이 주석 구간의 시작부분에 - 를 하나 더 넣으면 결국 -- 이후의 것은 한줄 주석으로 처리되어 구간주석

시작 기능을 잃어 버립니다.

또한 기존에 구간 주석의 끝으로 사용한 --]] 은 결국 구간의 시작이 없기 때문에 -- 가 한줄 주석으로 처리 되어서

주석으로 처리할 구간을 풀어주게 되는 것 입니다.

 

반대로 시작부분의 --- 에서 - 를 하나 빼면 다시 구간이 주석으로 처리 되겠죠..

 

이러한 이유에서 많은 루아 코드작성자들이

--[[

--]]

 

를 구간 주석으로 사용하는 것 입니다.

 

예: 이건 제스크립트입니다.(Cheat Engine의 lua스크립트입니다.)


local form = createForm(true);

checkBoxes = createCheckBox(form);

control_setCaption(checkBoxes,"TEST");

control_setPosition(checkBoxes,10,20)

reinitializeSymbolhandler()

autoAssemble(xxx)

debugProcess(3)

--

xxx=[[

registersymbol(r2)

registersymbol(r2value)

alloc(r2,128)

alloc(r2value,4)


r2:

fild dword ptr [r2value]

jmp 004EDE19

r2value:

dd #255

]]


--

function TEST()

if checkbox_getState(checkBoxes)== 1 then

debug_setBreakpoint("Freestyle.exe+EDE16")

print("디버그 걸림")

else

debug_removeBreakpoint("Freestyle.exe+EDE16")

print("디버그 풀림")

end

end

--

function debugger_onBreakpoint()

  EIP=getAddress("r2")

  debug_continueFromBreakpoint(co_run)

return 1

end

--

--Lua강좌

checkbox_onChange(checkBoxes,TEST)


위에 보시는거와 동일하게 --는 지금 주석문이지만 줄을 나누기위해서 일부로 넣은것입니다.



반응형

루아스크립트에서는 자신의 함수를 만들어 사용할 수 있습니다.

이러한 함수는 호출되어야 실행이 됩니다.

 

루아에서는 함수도 하나의 변수 입니다.

함수를 지정하는 형식은 function 이라는 예약어에 의하여 다음과 같습니다.

 

function 함수명([인수1,인수2,...])

-- 함수 코드

end

 

위와같이 함수는 function 이라는 루아 예약어에 의하여 선언 됩니다. 함수명은 일반적인 언어와 같이 영문자로 시작하여

영문자/숫자/_(underbar) 등에 의하여 명명될 수 있습니다.

인수는 없어도 되고 그 갯수에는 관계가 없습니다.

 

이렇게 만들어진 함수는 호출이 되어야만 실행 됩니다.

 

다음과 같은 예를 살펴보죠.

 

-- lua source code

print("Hello LuaWin !!!")

 

만약 위와 같이 lua 코드를 작성하여 LuaWin에서 실행하면 위의 코드는 실행 메뉴입력에 의하여 바로 실행 됩니다.

그러므로 consol 에 Hello LuaWin !!! 이라고 출력을 하겠지요.

 

 

그러나 만약

function test()

print("Hello LuaWin !!!")

end

 

이라고 작성 하였다면, LuaWin에서 메뉴의 실행을 선택해도 해당 함수는 실행되지 않습니다.

 

앞서 말했듯이 함수는 호출이 되야 실행되고, 함수의 밖에 있는 실행문들은 스크립트 코드를 루아 가상머신이

읽어들여 바로 실행 됩니다. 이러한 함수 밖의 실행문들은 실행 순서가 위에서 부터 아래로 실행됩니다.

 

그러면 test() 라는 함수를 어떻게 호출할까요?

 

다음과 같이 하면 됩니다.

 

function test()

print("Hello LuaWin !!!")

end

 

test()

 

이렇게 test() 라는 함수호출을 추가하면 됩니다. 그러면 test()라는 함수 호출은 함수 밖에 있기 때문에

루아 가상머신이 위의 코드를 읽어 들여 test() 라는 함수 호출 부분을 실행하면서 결국 function test() 라는

함수를 호출하게 되는 것이죠.

 


실행하여도 Consol에는 아무 변화가 없다.

 


이렇게 실행하면 test() 라는 함수가 호출되어 Consol 에 정상적으로 출력이 나옵니다.

 

이상으로 루아 코드의 자동 실행과 함수 호출에 대하여 살펴 보았습니다.

 

감사 합니다. 


[루아스크립트]

반응형

1. 설치 

LuaWin 은 설치가 필요없다.

그냥 프로그램을 다운받아 아무 폴더(예: D:\LuaWin) 에 압축을 풀어서 LuaWin.exe 를 실행하면 된다.

 

2. 설치 제거

설치가 필요 없으니 제거 역시 간단하다. 즉 해당 폴더만 지우면 된다.

 

3. LuaWin은 무엇을 지원하나?

지금 버전의 LuaWin은 lua 표준 기능을 지원한다.

 

LuaWin.exe를 실행하면 다음과 같은 창이 뜬다.

 


화면은 크게 두 영역으로 나뉜다.

위(Lua Source) 에는 Lua Code를 작성 하는 부분이고 아랫쪽(Consol)은 Lua code를 실행할 경우 print 함수나 기타 오류등

메시지가 출력되는 영역이다. Consol은 LuaWin 의 콘솔 출력이라 생각하면 된다.

 

Lua Source 영역에 자신이 작성하는 루아 코드를 입력(저장/읽기 등등 메뉴를 통해 가능)한 후 Run 메뉴를 선택하면

실행하게 된다.

 

예) Hello LuaWin !!!

 

다음과 같이 작성하여 실행해 보자. Consol 에 결과가 출력될 것이다.

 


[루아스크립트]

반응형

조건문과 true/false [루아스크립트]

 

조건문은 문장의 결과로서 참/거짓중 하나의 값만을 의미하는 문장을 의미합니다. 여기에는 몇가지 연산자가 비교수단으로 사용됩니다.

  • == : 동일비교.
  • ~= : 다름비교. (위와 반대)
  • >=, <=, >, < : 크기비교.
  • not : 부정. true는 false로, false는 true로.
  • and : "그리고"의 의미. 두개의 조건문이 모두 true여야 true로 처리.
  • or : "또는"의 의미. 두개의 조건문이 모두 false여야 false로 처리.
  • true : 항상 참.
  • false : 항상 거짓.

 

if 문

 

기본 if문은 다음과 같다.

if i ~= 0 then
  print("0이 아니자나!")
end

물론, 아닐 경우도 첨부할 수 있다. 이때에는 else를 사용한다. (else위에 end를 쓰지 않는 것에 주의한다. end는 맨 마지막에 한번만 적으면 된다. )

 

 

if i == 0 then   -- i가 0과 같으면
  print("0이군.")
else
  print("0아님.")
end

 

 

아닐경우 한번더 검사를 하고 싶으면 elseif를 사용한다. 역시 가장 마지막에만 end를 쓴다는 것에 주의.

 

if i == 1 then   -- i가 1과 같으면
  print("1이군.")
elseif i == 0 then  -- 그렇지 않고 i가 0과 같으면
  print("0이네~")
else
  print("0도 1도 아니네~")
end

 


 

while 문

 

기본 문법은 다음과 같다. 이 명령의 의미는 "지정한 조건이 true값을 반환할 동안 반복적으로 실행한다"는 뜻이다.

while 조건문 do....end

 

 

예를 들면, 다음의 문장은 "!"를 100회 출력한다.

i = 0while i ~= 100 do -- i가 100이 아닐동안 반복한다 print("!") i = i + 1end

 

 

repeat 문

 

기본 문법은 다음과 같다. 이 명령의 의미는 "지정한 조건이 true가 될때까지 반복적으로 실행한다"는 뜻이다. (즉, 위 while문과는 반대의 의미이다!)

repeat....until 조건문

 

 

예를 들면, 다음의 문장은 "redpixel"을 50회 출력한다.

i = 50repeat print("redpixel") i = i - 1until i == 0 -- i가 0이 될때까지 반복한다

 

for 문

다른 언어와의 마찬가지로 지정된 범위를 지정함으로서 반복명령을 수행하는 것이 for명령이다.

기본 문법은 다음과 같다

(작성중)


반응형

함수는 일정한 실행단위를 어느 순간에 한꺼번에 실행하기 위해 하나의 값으로 선언해놓은 것입니다. 즉, 함수값을 가지는 변수는 그 자체로 실행이 가능합니다.

루아는 값을 여러개 return할 수 있습니다. (예를 들면, a, b, c = func(d) 이런 것이 가능합니다.)

기본 문법은 다음과 같습니다. ([] 표시는 안적어도 문법에 맞다는 의미입니다. 즉, 인자1, 인자2...는 함수성격에 따라 적어도되고 안적어도 됩니다.)

 [루아스크립트]

 

function 함수명 ([인자1, 인자2, ...])
...
end

 

 

다음은 인자로 넘겨받은 문자열을 "루아"를 끝에 붙여서 출력하는 함수입니다.

 

function foolprint (i)
  local tmp = i.."루아"
  print(tmp)
end

 

 

함수를 사용하는 것은 다음과 같이 합니다.

 

foolprint("루아") -- "루아"라고 출력됩니다

 

함수는 반환값을 가질 수도 있습니다. 이때에는 함수내에 return이라고 하는 키워드를 사용합니다. 물론, 루아 특성상 여러개의 값을 반환할 수 있습니다.

다음은 두개의 인자를 받아서 더한 결과와 곱한 결과를 각각 반환하는 함수의 예입니다.

 

 

함수는 반환값을 가질 수도 있습니다. 이때에는 함수내에 return이라고 하는 키워드를 사용합니다. 물론, 루아 특성상 여러개의 값을 반환할 수 있습니다.

다음은 두개의 인자를 받아서 더한 결과와 곱한 결과를 각각 반환하는 함수의 예입니다. 
 

function calc1(x, y)
  local a = x + y
  local m = x * y
  return a, m
end

a, b = calc1(10, 10)
print(a, b) -- "20   100"이라고 출력됩니다.

반응형

루아에서 변수란 "어떤 값을 담고 있는 것의 명칭" 으로 정의한다. 즉 앞서 설명한 데이타 타입의 값은 모두 변수에 저장된다.

 

루아에서는 다음과 같이 다중 대입이 가능하다. [루아스크립트]

 

  • x = y = 10 -- x 와 y 에 동시에 10을 대입한다.
     
  • z = 20
  • x,z = z , x  -- x와 z의 값을 교환, 즉 x = 20 , z 는 10이 담기게 된다.
     
  • y, z = 5, 7  -- y = 5; z = 7 과 동일하다

 

숫자

 

다음 예제와 같은 연산이 가능하다.

 

a = 10 + 4 -- 덧셈

b = 5 * 5 -- 곱셈

c = 10 - 40.4 -- 뺄셈

d = 55/5.3 나눗셈

e = 10 ^ 3 -- 거듭제곱 (승)

 

또한 루아에서는 math 라는 객체에서 mod() 라는 함수를 제공한다. math 라이브러리는 루아의 수학적 연산 관련 함수들을 제공한다.

 

 

 

문자열

 

  • 루아에서의 문자열내에서 글자에 대한 인덱싱은 1부터 시작한다. C 언어와 같이 0 이 아니다.
  • 음수 인덱싱도 허용된다. 이때는 문자열의 맨 끝에서 부터 역으로 인덱싱을 하게 되다. 즉 -1 은 문자열의 맨 마지막 문자를 나타낸다.
  • 두개의 문자열의 병합은 ".." 연산자를 사용한다. 다음은 두개의 문자열을 합쳐 하나의 문자열로 만드는 것이다.
     
    a = "abc"
    b = "123"
    c = a..b
     
    c 는 "abc123" 이 된다.

 

 

문자열 제어 함수

 

문자열 제어 함수 라이브러리는 문자열 관리를 위한 검색, 부분문자열의 추출, 패턴 대입등등을 지원하는 일반 함수들을 제공한다.

문자열 라이브러리의 모든 함수는 테이블 string 내에 담겨 있다.

 

string.byte(s,[,i])

 

문자열 s의 i번째 문자의 내부 숫자로 표현된(예를 들면 , 아스키 코드값) 코드를 반환한다. 만일 i를 지정하지 않으면 1로 간주 된다. i는 물론 음수로 지정될 수 있다.

 

string.char(i1,i2,....)

 

0 이상의 정수만을 인자로 받는다. 각각의 숫자가 나타내는 코드에 해당되는 문자를 반환 한다. 결국 i1,i2 등의 인자는 아스키 코드값들이 된다.

 

 

string.find(s, pattern [, init[, plain]])

  • 문자열 s내에서 pattern에 가장 첫번째로 맞는 부분을 찾아 반환한다. 만약 한개를 찾았다면 find()함수는 일치점의 시작과 끝을 나타내는 s의 인덱스들를 반환한다. 찾지 못하면 nil을 반환한다.
  • 만약 pattern 문자열내에 "캡쳐"옵션이 지정되어 있다면, 캡쳐된 문자열들도 반환값에 포함되어 반환된다.
  • init 인자는 어디서부터 검색을 시작할 것인지에 대한 s 문자열내의 인덱스를 지정한다. 지정하지 않으면 1로 간주되며, 음수지정도 가능하다.
  • plain 인자의 값을 true로 놓으면 패턴 매칭 기능을 끄는 효과가 있다. 이것은 아주 평범한(plain) 부분 문자열을 검색하는 명령이 되며, pattern 인자내에 들어있는 값들은 무시된다. 
    만일 plain 인자를 true로 지정하면 init도 반드시 지정해야 한다는 점에 주의해라. plain은 지정하지 않으면 당연히 false로 간주된다.

 

string.len(s)
 

문자열의 길이를 반환한다. ""(빈 문자열)은 0을 반환한다. 첨부된 0값도 갯수에 포함된다. 그러므로

 

예를 들면 "a\000b\000c"의 길이는 5가 된다. 

 

 

string.lower(s)

 

주어진 문자열을 모두 소문자로 바꾸고 그 결과 문자열의 복사본을 반환한다. (원본은 바뀌지 않는다.) 대소문자에 대한 구분은 현재 로케일 설정을 따른다.

 

string.rep(s,n)

문자열 s를 n번 반복하여 모두 병합한 값을 반환한다. 

string.sub(s,i,[,j])

문자열 s내에서 i에서 시작하고 j에서 끝나는 부분에 대한 부분 문자열을 반환한다. i와 j는 음수 지정이 가능하다. j를 지정하지 않으면, -1로 간주된다. (즉, i에서 끝까지의 영역을 나타내게 된다.) 여러가지 지정을 예를 들면, 만일 문자열 s의 길이 j 만큼의 접두어를 때어내려면, string.sub(s, 1, j)라고 지정하면 되며, string.sub(s, -i)는 문자열 s에서 i길이 만큼의 접미어를 때내는 효과가 있다. 

 

string.upper(s)

문자열 내의 모든 소문자들을 대문자로 바꾼 결과를 반환한다. 대소문자에 대한 구분은 현재 로케일 설정을 따른다.

 

string.format(formatstring,e1,e2,....)

  • 첫번째 인자(반드시 문자열이어야 함)로 주어지는 정의를 따라서 다양한 수의 인자들을 잘 포맷한 결과물을 반환한다. C 언어에서 printf() 함수를 생각하면 된다. 내부 포맷룰도 같지만, 다음과 같은 차이가 있다.
    • *, l, L, n, p, h는 지원되지 않는다.
    • q 옵션이 제공된다. the q option formats a string in a form suitable to be safety read back by the Lua interpreter : The string is written between double quotes, and all double quotes, returns, and backslashs in the string are correctly escaped when written. For instance, the call <PRE>string.format('%q', 'a string with "quotes" and \n new line')</PRE>
      will produce the string:
      <PRE>"a string with \"quotes\" and \newline"</PRE>
  • c, d, E, e, f, g, G, i, o, u, X, x와 같은 모든 옵션은 숫자를 적용하여 사용하며, q와 s만 문자열을 적용하여 사용된다. the * modifier can be simulated by building th appropriate format string. For example, "%*g" can be simulated with "%"..width.."g". 

    주의 : %s로 포맷되는 문자열 값은 '내장된 0' 값을 포함할 수 없다. 

     

     

    테이블

    다음의 예문은 "temp" 라는 table에 차례로 "a","b","c"라는 값을 설정하는 것입니다. <PRE>temp = {"a","b","c"}</PRE>위의 예문의 테이블에서 값을 가져오려면. []를 사용하시면 됩니다.


     

    다음의 예문은 위에서 작성한 "temp"에서 첫번째 값을 가져오는겁니다. <PRE>print(temp[1])결과: a</PRE>

     

     

    테이블 관련 함수들

     

    table.foreach(테이블,함수)

  • 지정한 '테이블'의 각 값에 대해 각각 '함수'를 실행합니다. (상당히 유용한 함수!)
  • 순서는 인덱스값의 순서대로 실행됩니다.
  • '함수'가 매번 실행될때마다 "인덱스, 값"으로 한번에 2개씩 인자를 넘깁니다.
  • 다음은 t1 테이블의 각 요소를 화면에 출력하는 예제입니다. (print 다음에 ()가 없다는 것에 주목!)

     

     

    table.foreach(t1, print)

     

    > t1 = {}
    > t1.redpixel = 10
    > t1.whitepixel = 30
    > t1.raktavisa = 20
    > t1.hong = 40
    > table.foreach(t1, print)
    raktavisa       20
    hong    40
    redpixel        10
    whitepixel      30

     

     

    table.foreachi(테이블,함수)

  • 지정한 '테이블'의 각 값에 대해 인덱스의 순서대로 각각 '함수'를 실행합니다.
  • 즉, 테이블의 인덱스는 반드시 숫자로 지정되어있어야하고 1에서 n까지 숫자의 건너뜀없이 지정되어 있어야 합니다!
  • foreach()를 숫자 인덱스에 의해 마치 for문처럼 실행하고자 할 때 사용합니다.
  • 다음은 foreach(), foreachi()의 비교를 위해 콘솔에서의 실행을 캡쳐한 것입니다.

    > t1 = {}
    > t1[1] = 10
    > t1[3] = 30
    > t1[2] = 20
    > t1[4] = 40
    > t1[9] = 90
    > t1[6] = 60
    > table.foreach(t1, print)
    1       10
    2       20
    3       30
    4       40
    6       60
    9       90
    > table.foreachi(t1, print)
    1       10
    2       20
    3       30
    4       40


  • 반응형

    루아는 다음과 같은 6가지의 데이터 타입을 제공한다. [루아스크립트]

     

    1. nil : 아무것도 아닌 텅빈 값을 의미한다. 일반적으로 변수를 초기화 할때 사용한다. 

      C/C++ 에서의 null 과 다르다. C/C++ 의 null 은 정수 0을 의미한다. 그러나 루아에서 nil은 0도 아니다. 말그대로 아무것도 아니다.
    2. number : 0, 3.141592 등과 같은 사칙연산이 가능한 모든 숫자값을 의미한다. 

      루아는 정수와 실수를 구분하지 않는다.
    3. string : 말그대로 문자열이다. 루아의 기본타입이며, 스크립트상에서는 " 로 둘러싸 지정하게 된다. (예를들어  "1234" , "luaplay") 
    4. userdata : C/C++ 과의 교류를 위해 존재하는 타입이다. page 내에서는 핸들이라고 지정하는 것들이 바로 이 타입이다. 스크립트를 작성할때 직접 값을 제아할 경우는

      드물고, 보통 엔진에서 제공되는 함수를 통해 설정하고 변경,해제하게 된다.
    5. function : 루아에서는 함수도 하나의 값으로 취급한다. 즉 function 으로 선언되면 실행되 되지만 function 타입의 변수에 대입도 가능합니다. (table과 연합하여 사용하면 매우 강력해 진다)
    6. table : 루아에서 제공하는 최강의 범용 자료구조 타입이다. 다른 타입으로 변환이 불가능하며, 조금 사용법이 복잡하다.

     

    루아의 데이터 타입을 궂이 외울 필요는 없다. 추후에 루아 프로그래밍을 직접 해보면서 자연적으로 알 수 있을 기회가 있을 것이다.

     

    특히 function 과 table은 직접 코딩을 해보아야 이해를 할 수 있으며, userdata는 사실 LUAPLAY에서 직접 사용하지 않고 있다.

    반응형

    LUA 란 무엇인가? [루아스크립트]

     

    표현적으로 우리말로 읽으면 "루아" 라고 읽으면 된다.

     

    다음 글은 www.lua.org 에서 말하는 LUA 에 대한 내용이다.

     

        What is LUA?

        Lua is a powerful, fast, lightweight, embeddable scripting language.

        Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics. Lua is dynamically typed, runs by interpreting bytecode 
        for a register-based virtual    machine, and has automatic memory management with incremental garbage collection, making it ideal for configuration, scripting, and rapid prototyping.

     

        참조: http://www.lua.org/about.html

     

    위에서 설명하듯이 Lua 는 매우 강력하고, 속도가 빠르며, 가볍고, 내장 가능한 스크립팅 언어이다.

     

    루아는 스크립트 언어로 처음부터 C++ 같은 저수준 언어보다 쉽게 배우고 다룰 수 있도록 만들어진 것이다. 그 덕분에 언어를 배우고 다루기가 쉬우며, 결과적으로 빠르게 만들 수 있어서 생산성이 높아진다.

    스크립팅 언어는 일반적인 저수준 언어(C/C++ 등)보다 빠르게 익힐 수 있다.

     

    특히 루아는 C++과의 연동이 쉽게 이루어지기 때문에, 게임 개발등에 있어서 스크립트 부분을 다루는데 종종 사용되고 있으며, 그 대표적으로 WoW 의 Addon package 가 루아로 작성 지원되고 있다.

     

    루아의 기술적 특징은 다음과 같다.

    • C/C++ 의 코드를 이식하기 쉽다. 이것은 엔진작업/스크립트(게임제작)작업의 분업화를 가능하게 해준다. 물론, 반대로 루아코드를 C/C++ 상에서 실행하는것도 가능하다.
    • 동종 스크립트 언어 중에서 최강의 속도와 효율을 자랑한다.
    • table 이라는 강력한 연관배열을 지원한다. 이것은 스크립트 제작시 자료의 정리를 상당히 용이하게 해준다.
    • 문법이 간단하다. 데이터 타입이 존재하지만 사용시에는 숫자, 문자열 정도만 구분하면 되며 왠만한 경우는 자동으로 변환을 수행한다.

    반면에 다음과 같은 단점도 존재한다.

    • 스크립트 언어라면 모두가 가지고 있는 개비지 콜렉션이 존재한다. 즉 사용되지 않는 메모리는 일정정도 차게 되면 자동으로 해제해 버린다. 이것은 성능저하, 직접적인 메모리 관리의 어려움등의 단점을 만든다.
      다행히 루아 5.0 이후버젼에는 이러한 개비지 컬렉션 처리의 한도를 조정할 수 있어 이 현상을 이러나지 않도록 만들 수 있다.
    • 간단하고 심플한대신, 지원하는 함수가 정말로 기본적인 것 밖에 없다. (이것이 단점인가 생각해본다. 간단하면서 다 할 수 있다면, 그것 역시 장점 아닐까 생각한다)


    + Recent posts