프로그래밍/Corona SDK2013. 8. 27. 18:41

* 테이블이란


 테이블은 루아에서 사용하는 데이터 구조체이다. nil값을 제외하면 숫자뿐 아니라 문자열이나 다른 어떤 값으로도 참조할 수 있는 연관 배열을 구현한다. 타 언어의 배열, 리스트, 셋, 레코드, 그래프 등과 동등하다. 

 루아 테이블은 연관 배열과 닮았다. 연관 배열은 숫자만이 아니라 어떤 자료형도 인덱스로서 사용해 참조할 수 있다. 테이블에 정수 인덱스를 사용하면 배열이 된다. 고정된 크기가 아니므로 필요한만큼 크기가 늘어난다. 테이블을 초기화할 때, 크기는 간접적으로 정해진다.



* 테이블 생성 예제


a = {}     --> "a"라는 이름의 테이블 생성

b = "y"

a[b] = 10    --> 키는 "b", 값은 10인 새로운 요소를 만들어 넣는다

a[20] = "Monday"    --> 키는 "20", 값은 "Monday"인 새로운 요소를 만들어 넣는다

print(a["y"])     --> 10이 출력된다

b = 20

print(a[b])    --> "Monday"가 출력된다

c = "hello"    --> 새로운 변수에 "hello" 값을 넣는다

print(c)        --> "hello"가 출력된다


 5번째 줄을 보면 a["y"]는 3번째 줄에 있는 값을 인덱스로 사용한다는 사실을 알 수 있다. 7번째 줄에서 a[b]는 변수 b의 새로운 값인 20을 인덱스로 사용해 문자열 "Monday"를 값으로 갖는다. 마지막 줄에서 c는 이전 변수들과는 다르게 단지 "hello" 문자열 값만을 가지고 있다.



* 테이블을 배열처럼 사용하기


 테이블 키는 연속적인 정수들을 사용해 만들 수 있는데 1부터 시작하게 된다. 이런 속성을 이용해 배열(또는 리스트)로 사용할 수 있다.


colors = 

{

[1] = "Green",

[2] = "Blue",

[3] = "Yellow",

[4] = "Orange",

[5] = "Red"

}


print(colors[4])           --> "Orange"가 출력된다


 테이블 생성자를 다음처럼 만들면, 일일이 테이블 키를 지정할 필요 없이 좀 더 빠르고 손쉽게 배열을 만들 수 있다.


colors = {"Green", "Blue", "Yellow", "Orange", "Red"}

print(colors[4])          --> 똑같이 "Orange"가 출력된다



* 테이블 내부의 값을 교체하기


 테이블을 사용해 작업 중, 기존 값을 수정, 제거, 또는 새로운 값을 추가할 수도 있다. 할당 연산자를 사용하면 된다. 세 사람과 그들 각자가 좋아하는 음료수를 내용으로 가지는 테이블을 만드는 예를 보자. 어떤 한 사람의 음료수(내용)를 변경할 수도 있고, 테이블에 새로운 사람과 그 사람이 좋아하는 음료수를 세트로 추가할 수도 있으며, 기존에 있던 사람과 음료수를 세트로 제거할 수도 있다.


drinks = {Jim = "orange juice", Matt = "soda", Jackie = "milk"}

drinks.Jackie = "lemonade"    --> 원래 Jackie의 값이었던 "milk"를 "lemonade"로 변경

drinks.Anne = "water"     --> Anne과 "water"를 세트로 추가

drinks.Jim = nil      --> Jim이 테이블에서 제거된다. 

print(drinks.Jackie, drinks.Anne, drinks.Matt, drinks.Jim)    --> 각각의 값을 출력한다


drinks.Jackie의 원래 값인 "milk"는 "lemonade"로 변경된다.

drinks.Anne 키와 그 값인 "water"가 테이블에 새롭게 추가된다. 추가되기 전에 drinks.Anne의 값을 얻으려 하면 nil이 나온다.

drinks.Matt = "soda"는 변경되지 않았으므로 그대로 있다.

drinks.Jim의 원래 값은 "orange juice"이나 값이 nil로 변경된다. 테이블에서 키 Jim이 제거된다.


 주의 : 이 경우 문자열 키 값을 인덱스로 사용해 값을 넣어 배열을 만들었는데, 이 배열은 정수를 사용한 순서와는 관계 없다. 즉 위 예제에서 Jackie의 값을 얻기 위해 print(drinks[3]) 을 실행해도 nil 값만 나온다. 위 예제와 같이 문자열을 인덱스로 사용해 배열을 만들었을 때 그것을 순서대로 참조하기 위해서는 별도로 for문 등을 이용해 순서를 매겨서 판단해야 한다. 



* 테이블의 크기(요소의 갯수) 구하기


 위 항목에서 설명했듯이 루아의 테이블은 동적으로 생성되고 자동으로 크기가 변하므로 그 갯수를 파악하거나 어떤 자료가 몇번째에 들어가있는지 수치적으로 참조하기가 어렵다. 이런 처리를 위해서는 몇 가지 편법을 써야 한다. (참고 : http://icarosss.egloos.com/1274992)


 1. #, getn 사용


 i = #테이블명

 i = table.getn(테이블명)


 위와 같이 하면 테이블의 요소 갯수가 i 값으로 구해진다. 다만 이것은 요소가 연속적인 수치로 되어있을 때에만 유효하다. 예를 들어,


t = {1, 2, 3, a=10}


 위와 같은 테이블이 존재할 경우 t[4]의 값이 nil이므로 3을 돌려준다.

 

 이런 불규칙적인 데이터가 들어있을 경우에라도 모든 요소의 갯수를 전부 구하고 싶을 때에는 pairs() 함수를 이용한다.



 2. pairs() 함수 사용


function getTableSize(t)    --> 테이블 갯수 크기 구하기용 함수 선언

    local size = 0                    --> 테이블 갯수 크기를 알아보기 위한 변수 size 선언

    for index, value in pairs(t) do    --> 루프를 테이블 요소의 갯수만큼 돌린다

        size = size + 1              --> size를 1씩 누적시킨다

    end

    return size                         --> 루프가 끝난 뒤 누적된 size 값을 테이블의 갯수 크기로 반환한다

end


 ipairs() 함수도 있는데, 이것은 정수 요소에만 접근하려고 할때 사용하면 된다.

 


* 테이블에 값 넣기


 빈 테이블에 하나씩 값을 넣어 테이블을 채워 보자. 테이블을 생성하고 초기화하기 위해서 생성자를 사용하는데, 가장 간단한 생성자는 빈 생성자이다.


myNumbers = {}    --> 빈 테이블 생성자


for i = 1, 5 do

myNumbers[i] = i    --> 1에서 5까지 증가하는 루프를 돌리면서, 테이블 myNumbers에 순서대로 값을 집어넣는다.

end


for i = 1, 5 do

print("This is number " .. myNumbers[i])    --> 1에서 5까지 증가하는 루프를 돌려, 테이블 myNumbers에서 순서대로 

  값을 읽어 출력한다.

end


 다음은 터미널에 출력된 결과 값이다.


...

Posted by windship