'게임개발공부 > LUA공부' 카테고리의 다른 글

테이블  (0) 2014.01.13
문자열 정리  (0) 2014.01.13
연산자.  (0) 2014.01.13
루아의 변수 선언과 규칙.  (0) 2014.01.13
루아스크립트 콘솔에서 실행하기  (0) 2014.01.13
Posted by JJOREG

테이블

 

Ruby언어의 Hash, Python언어의 Dictionary, Java의 Map과 같은 자료형이다.

다만, 루아의 테이블은 복합 자료형이면서도 중요한 역활을 한다. key-value가 아닌 배열이나 객체 프로그래밍을 할 때 필요하기 때문이다. 


우선 테이블은 익명성이라는 특징을 가진다.

> cool_table = {}
> print(cool_table)
table: 0x8268920

 

테이블 그 자체의 출력 값은 테이블 요소 값의 관계로써 별 의미가 없다.

 

 

 

> cool_table["name"] = "짱구"
> cool_table["age"] = "다섯살"
> print(cool_table["name"].."는 몇십년째 "..cool_table["age"].."이야.")
짱구는 몇십년째 다섯살이야.

 

> print(cool_table)
table: 0x8268920

 

> print(cool_table["poo"])
nil


선언과 호출은 간단하다. 마치 key-value꼴로 쓴다. key에 들어갈 자료형은 무엇이든지 상관없다만 nil을 key로 쓸 수 없다.

후에 cool_table을 다시 print()로 찍어보았지만 요소와는 별 관계가 없음을 알 수 있다.

또한 없는 key를 호출할 경우 쓰레기값인 nil을 돌려받는다.

 

 

 

> cool_table = {["name"]="짱구", ["age"]="다섯살"}


테이블은 이렇게도 만들 수 있다.

전체적으로 {}로 감싸며 key는 []로 감싼 형태이다.

 

 

 

> cool_table = {}
> cool_table["age"] = "다섯살"
> cool_desk = {}
> cool_desk.age = "다섯살"

> =(cool_table == cool_desk)
false


만드는 방법이 다를 뿐, cool_table과 cool_desk는 서로 같은 key-value를 가진 테이블이지만

참조부분이 다르므로 결과적으로 false다.

 


 

'게임개발공부 > LUA공부' 카테고리의 다른 글

조건문  (0) 2014.01.13
문자열 정리  (0) 2014.01.13
연산자.  (0) 2014.01.13
루아의 변수 선언과 규칙.  (0) 2014.01.13
루아스크립트 콘솔에서 실행하기  (0) 2014.01.13
Posted by JJOREG

문자열

 

> print("Hello!")
Hello!
> print('Hello!')
Hello!

> print([[Hello!]])

Hello!

> =[[동해물과 백두산이 마르고 닳도록
>> 하느님이 보우하사 우리나라만세
>> 무궁화 삼천리 화려강산
>> 대한사람 대한으로 길이보전하세.]]
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이보전하세.

 

큰 따옴표, 작은 따옴표, 중괄호로 감싸면 문자열이 된다.

긴 문자열은 [[로 시작해서 끝날 때 ]]로 닫는다.

 

 

 

> = 'I'm so happy to see you.'
stdin:1: '<eof>' expected near 'm'
> ="I'm so happy to see you."
I'm so happy to see you.
> =[[I'm so happy to see you.]]
I'm so happy to see you.

대신에 문자열로 쓴 기호가 문자열 내에 중복되서는 안된다.

 

 

 

> ="I Like..\nA\tP\tP\tL\tE"
I Like..
A    P    P    L    E

 

서식 문자열도 동일하게 쓸 수 있다.

 

 

 

> name = "철수"
> kim = "김"
> print(kim + name)
stdin:1: attempt to perform arithmetic on global 'kim' (a string value)
stack traceback:
    stdin:1: in main chunk
    [C]: ?

> print(kim..name)
김철수

> kcs = kim..name
> print(kcs)
김철수

 

문자열을 서로 합칠 때는 + 가 아닌 .. 를 사용한다.

문자열 + 정수의 경우에도 ..를 사용할 수 있다.

 

 

 

> ="What is it?"
What is it?
> = "It's "..type("What is it?").."."
It's string.

 

데이터 타입을 알아보기 위해서 type() 함수를 쓴다. 파이썬의 dir()과 같은 역활이다.

 

 

 

-- 제일 나쁘고 느림
local
s = '' for i=1,10000 do s = s .. math.random() .. ',' end io.stdout:write(s)

-- 빠름 for i=1,10000 do io.stdout:write(tostring(math.random()), ',') end -- 셋중에 제일 빠르지만 더 많은 메모리를 필요료함 local t = {} for i=1,10000 do t[i] = tostring(math.random()) end io.stdout:write(table.concat(t,','), ',')

물론 문자열도 불변의 데이터 배열이므로 생성과정에서 자원낭비가 발생할 수 있다.

세 코드중 첫번째 코드가 가장 나쁜 형태로써 제일 느리다.

 

해석을 덧붙이자면 math.random() 메서드로 임의의 정수를 뽑아 문자열 s와 ","로 결합하게 된다.

이것을 10000을 반복하게 되는데 첫번째는 별 생각없이 .. 를 썼다.

두번째의 경우 정수 데이터를 tostring()이란 함수를 이용해 문자열로 바꾼 후에 s와 ","를 결합했다.

 

아마 동적 언어의 특성상 서로 다른 자료형의 데이터 연산이 이루어질 때 '타입 검사'를 하는데 결국 10000번씩이나 타입검사를 시도하면서 성능을 저하 한다는 뜻인 것같다.

두번째 코드는 tostring()을 사용해줌으로써 동적인 '타입검사'를 과감히 pass시켜 정적(?)인 흉내를 내준 셈이다.

 

 

 

 

 


 

문자열 라이브러리

더 많은 라이브러리들은 이 문서를 참고하도록 하자. 여기서는 필자에게 필요한 것들만 정리한다.

 

바꾸기 - gsub()

> =string.gsub("안녕 철수야", "철수", "짱구")
안녕 짱구야    1

 

소문자 - lower()

> =string.lower("KUKUDAS")
kukudas

 

대문자 - upper()

> =string.upper("kukudas")
KUKUDAS

 

반복 - rep()

> =string.rep("Oh~ Yes!\n", 4)
Oh~ Yes!
Oh~ Yes!
Oh~ Yes!
Oh~ Yes!

 

뒤집기 - reverse()

> =string.reverse("kukudas")
sadukuk

조각썰기(슬라이징, 서브, 부분 추출) - sub()

> =string.sub("kukudas", 4)
udas
> =string.sub("kukudas", 0, 4)
kuku


매치(정규식) - match()

> =string.match("TikTak 234 Koko", "%d+ ")
234 
> return string.match("TikTak 234 Koko", "%a+")
TikTak
> return string.match("TikTak 234 Koko", "(%a+) %d+ (%a+)")
TikTak    Koko
> return string.match("TikTak 234 Koko", "(%a+)%d+(%a+)")
nil

아뿔사. 정규식 언어가 다르잖아.

 

포매팅 - format()

> =string.format("%s", "HAHA")
HAHA

 

길이 - len()

> =string.len("ABCDE")
5
> =string.len(123)
3

 

 

 

 

논리(불, 부울)

> =(1 == 1)
true
> =(2 == 1)
false
> a = "A"
> =(a == "A")
true

 

별 달리 중요한 함수는 없으니 연산자만 훌어보고 넘어가자.

 

 

 

 

 

테이블

Ruby언어의 Hash, Python언어의 Dictionary, Java의 Map과 같은 자료형이다.

다만, 루아의 테이블은 복합 자료형이면서도 중요한 역활을 한다. key-value가 아닌 배열이나 객체 프로그래밍을 할 때 필요하기 때문이다. 


우선 테이블은 익명성이라는 특징을 가진다.

> cool_table = {}
> print(cool_table)
table: 0x8268920

 

테이블 그 자체의 출력 값은 테이블 요소 값의 관계로써 별 의미가 없다.

 

 

 

> cool_table["name"] = "짱구"
> cool_table["age"] = "다섯살"
> print(cool_table["name"].."는 몇십년째 "..cool_table["age"].."이야.")
짱구는 몇십년째 다섯살이야.

 

> print(cool_table)
table: 0x8268920

 

> print(cool_table["poo"])
nil


선언과 호출은 간단하다. 마치 key-value꼴로 쓴다. key에 들어갈 자료형은 무엇이든지 상관없다만 nil을 key로 쓸 수 없다.

후에 cool_table을 다시 print()로 찍어보았지만 요소와는 별 관계가 없음을 알 수 있다.

또한 없는 key를 호출할 경우 쓰레기값인 nil을 돌려받는다.

 

 

 

> cool_table = {["name"]="짱구", ["age"]="다섯살"}


테이블은 이렇게도 만들 수 있다.

전체적으로 {}로 감싸며 key는 []로 감싼 형태이다.

 

 

 

> cool_table = {}
> cool_table["age"] = "다섯살"
> cool_desk = {}
> cool_desk.age = "다섯살"

> =(cool_table == cool_desk)
false


만드는 방법이 다를 뿐, cool_table과 cool_desk는 서로 같은 key-value를 가진 테이블이지만

참조부분이 다르므로 결과적으로 false다.

 

 

 

 

배열, 테이블과 같은

제곧내. 배열도 테이블이다. key-value형식이 아닌 우리가 흔히 하는 요소가 한줄로 좌라락 배치된 모습이다.

 

> array = {1, 2, 3, "A", "B", "C"}
> print(array)
table: 0x8269410

 

배열이 곧 테이블이니라~

 

 

 

> array = {1, 2, 3, "A", "B", "C"}

> =array[1]
1
> =array[2]
2
> =array[3]
3
> =array[4]
A
> =array[5]
B
> =array[6]
C


테이블로 흉내낸 배열의 첫번째 요소의 위치 값은 1이다.

사실 알고보면 key가 자동으로 생성되었다고 봐야한다. 아래 코드를 줄인 게 이 코드이다.

 

> array = {[1]=1, [2]=2, [3]=3, [4]="A", [5]="B", [6]="C"}

 

그냥 척 봐도 key 없이 쓰는 게 훨씬 편해보인다. 어쨌든 배열이라는 것은 결국 테이블이라는 것이다.

 

 

 

> array = {[1]=1, [2]=2, [3]=3, [4]="A", [5]="B", [6]="C"}
> =len(array)
stdin:1: attempt to call global 'len' (a nil value)
stack traceback:
    stdin:1: in main chunk
    [C]: ?

 

> =#(array)
6

 

> array[#array+1] = "a"
> =array[#array]
a

> =array[1], array[2], array[3], array[4], array[5], array[6], array[7], array[8]
1    2    3    A    B    C    a    nil

 

> =table.concat(array, ":")
1:2:3:A:B:C:a


테이블의 길이가 알고 싶다면 테이블 앞에 #을 쓰면 된다. len은 string에 속한 클래스다.

 

#연산자는 배열의 뒤 꽁무니에 요소를 첨가할 때 써도 좋다.

맨 마지막 array[8]은 존재하지 않는 요소이므로 nil이다.

 

concat를 통해 테이블을 하나의 문자열로 엮어낼 수 있다. 파이썬에 str.join() 같은 역활이다.

 


 

'게임개발공부 > LUA공부' 카테고리의 다른 글

조건문  (0) 2014.01.13
테이블  (0) 2014.01.13
연산자.  (0) 2014.01.13
루아의 변수 선언과 규칙.  (0) 2014.01.13
루아스크립트 콘솔에서 실행하기  (0) 2014.01.13
Posted by JJOREG