문자열

 

> 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