문자열
> print("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 = "철수" > kcs = kim..name |
문자열을 서로 합칠 때는 + 가 아닌 .. 를 사용한다.
문자열 + 정수의 경우에도 ..를 사용할 수 있다.
> ="What is it?" |
데이터 타입을 알아보기 위해서 type() 함수를 쓴다. 파이썬의 dir()과 같은 역활이다.
-- 제일 나쁘고 느림 |
물론 문자열도 불변의 데이터 배열이므로 생성과정에서 자원낭비가 발생할 수 있다.
세 코드중 첫번째 코드가 가장 나쁜 형태로써 제일 느리다.
해석을 덧붙이자면 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"] = "짱구"
> print(cool_table)
> print(cool_table["poo"]) |
선언과 호출은 간단하다. 마치 key-value꼴로 쓴다. key에 들어갈 자료형은 무엇이든지 상관없다만 nil을 key로 쓸 수 없다.
후에 cool_table을 다시 print()로 찍어보았지만 요소와는 별 관계가 없음을 알 수 있다.
또한 없는 key를 호출할 경우 쓰레기값인 nil을 돌려받는다.
> cool_table = {["name"]="짱구", ["age"]="다섯살"} |
테이블은 이렇게도 만들 수 있다.
전체적으로 {}로 감싸며 key는 []로 감싼 형태이다.
> cool_table = {} > =(cool_table == cool_desk) |
만드는 방법이 다를 뿐, 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이다.
사실 알고보면 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"} > =#(array)
> array[#array+1] = "a" > =array[1], array[2], array[3], array[4], array[5], array[6], array[7], array[8]
> =table.concat(array, ":") |
테이블의 길이가 알고 싶다면 테이블 앞에 #을 쓰면 된다. len은 string에 속한 클래스다.
#연산자는 배열의 뒤 꽁무니에 요소를 첨가할 때 써도 좋다.
맨 마지막 array[8]은 존재하지 않는 요소이므로 nil이다.
concat를 통해 테이블을 하나의 문자열로 엮어낼 수 있다. 파이썬에 str.join() 같은 역활이다.
[출처] 루아(Lua), 한장에 정리!(미완성)|작성자 D4
'게임개발공부 > LUA공부' 카테고리의 다른 글
조건문 (0) | 2014.01.13 |
---|---|
테이블 (0) | 2014.01.13 |
연산자. (0) | 2014.01.13 |
루아의 변수 선언과 규칙. (0) | 2014.01.13 |
루아스크립트 콘솔에서 실행하기 (0) | 2014.01.13 |