코로나 SDK - 테이블
* 테이블이란
테이블은 루아에서 사용하는 데이터 구조체이다. 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
다음은 터미널에 출력된 결과 값이다.
...