테이블은 루아의 핵심 데이터 구조이다. 테이블이라고 하니까 왜 HTML의 table tag 가 생각나는데 그것과 상관은 없고 배열, 세트, 해시 등 다양한 데이터 구조를 심플하고 효율적으로 만들어 놓은 구조다. 테이블 자료형은 루아만의 특성이라고 볼 수 도 있다.

 

예를 들어 파이썬은 복합 자료형태로 리스트, 튜플, 딕셔너리가 있는데 루아는 테이블 하나에서 다 작동한다.

 

루아의 테이블은 객체다. 자바나 파이썬 같은 객체지향 언어에 익숙하면 자료형이 객체라는 말의 이해가 어렵지는 않다. 

 

* 먼저 배열처럼 사용해 본다.

-- array style

a = { }
a[1] = "A"
a[2] = "B"
a[3] = "C"

for i = 1, 3 do print(a[i]) end

문법은 배열과 같은데 해쉬맵처럼 키와 값이 대응되어 있다. 1 : "A", 2 : "B", 3 : "C" 이렇게 대응한다.

다음은 해쉬같은 문법을 사용해본다. key - value 가 대응한다. 숫자나 문자열이나 key와 value에 저장이 가능하다. 테이블에서 초기화가 되지 않은 전역변수를 선언하면 초기값은 nil 이다.

myHash = {}

myHash["name"] = "Steven"
myHash["age"] = 28
myHash["job"] = "police officer"

print(myHash["name"])
print(myHash["age"])
print(myHash["job"])

print(myHash)

myHash 로 출력하면 table(타입)과 64비트 주소를 출력한다. Table의 참조라는 뜻이다. 실제 사용은 키(key)값을 검색해서 데이터에 접근하는 것을 알 수 있다.

 

*주의할 점은 데이터를 다 사용한 후에 nil 설정을 해줘야 한다. 루아에도 자바와 마찬가지로 Garbage Collector(쓰레기 수거반)이 있는데 nil 이 그 신호를 보내준다. nil은 동적타입으로 사용한 메모리를 삭제하라는 지시와 같다. GC가 정확히 언제 이루어지는 것 까지 프로그래머가 관여할 수는 없지만 사용이 끝난 메모리는 최대한 빨리 반환해주는게 좋다.

 

자바와 비교해서 GC성능이 어떨지는 모르겠지만 그럴수록 신경 써주면 좋다.

myHash = nil

-> nil을 하면 GC가 할당되었던 메모리를 해제한다. 루아의 테이블이 동적타이프라는 것을 감안한다.(동적타이프 - dynamic type - 실행시간에 자료형이 결정된다. 힙 메모리를 사용)

 

 

키값을 입력하는 것은 아무래도 수고스러운 일이니까 아래와 같은 형태도 허용한다.

a = {}

a.a1 = "99 TIGER"
a.a2 = 77

print(a["a1"])
print(a["a2"])

 

 * 테이블 자료형의 인덱스(키)와 값을 사용하는데 있어서 미묘한 주의가 필요하다. 이게 다른 언어에서는 배열은 배열, 리스트는 리스트, 해쉬는 해쉬 같이 구분이 딱되어 있는데 그런 경계가 약하다. 프로그래머들 마다 좀 호불호가 갈릴 부분으로 보인다. 일단 루아는 국내 사용자들은 얼마 없고 해외에서 게임 스크립팅 같은 부분에 프로그램에 많이 사용한다. 자료형으로 보면 이게 파이썬 보다 더 단순한 문법인데... 확실히 온라인상에서 보면 사용자 연령층이 낮은 느낌도 있다.

 

테이블 생성자

 

테이블을 생성하는 가장 간단한 방법은 { } 중괄호 묶음이다. 비어있는 테이블이다. 초기화를 하지 않아도 된다.

 

값까지 입력하여 초기화 하는 방법은 아래와 같다.

 

food = {"떡볶이", "참치라면", "김치찌개", "돈까스김밥", "생우동"}

print(food[1])
print(food[2])
print(food[3])
print(food[4])
print(food[5])

중괄호 안에 값을 나열하면 인덱스(키)는 자동으로 생성된다. 주의할 점은 다른 언어의 배열(array)처럼 0부터 시작하지 않는다. 루아의 인덱스는 1부터 시작한다.

 

 

* 다른 방식의 생성자도 있다. 아래의 생성자도 약간 다른 느낌인데 e01은 문자열인 키(key)로 대입하는 값 "KIM" 과 맵핑한다.

EmployeeList = {
    e01 = "KIM",
    e02 = "LEE",
    e03 = "PARK",
    e04 = "KANG",
}

print(EmployeeList["e01"])
print(EmployeeList["e02"])
print(EmployeeList["e03"])
print(EmployeeList["e04"])

 

* 아래와 같이 조금 복잡한 방식의 사용법도 있다. 테이블 요소를 중첩시키면 인덱스가 부여된다. 인덱스와 중첩된 키로 값에 접근할 수 있다. 자료형의 정의에 유연성이 많다는 것은 그 만큼 난해함을 의미하기도 한다. 코드가 짧을 때는 별로 상관이 없으나 길어지면 골치아픈 부분이다. 그래서 테이블 자료형은 루아를 이해하는 주요한 특징이라 볼 수 있다.

 

polyline = {
    color="red",
    thickness=3,
    {x=5, y=7}, -- polyline[1]
    {x=-25, y=4}, -- polyline[2]
    {x=-6, y=99}, -- polyline[3]
}

print(polyline["color"])
print(polyline["thickness"])

print(polyline[1].x)
print(polyline[1].y)
print(polyline[2].x)
print(polyline[2].y)
print(polyline[3].x)
print(polyline[3].y)

 

 

* 테이블의 끝은 nil 값으로 판단한다. 아래의 테이블은 요소를 5개 포함하지만 length 연산자로는 3번째 까지 밖에 접근이 안된다. 필요한 경우 요소의 끝을 의미하는 값을 넣거나 실제 길이를 기록해둬야할 때도 있다.

(nil을 있는 그대로 출력하고 싶다거나 할 때)

 

a = {2, "teach", 30, nil, nil}

print("length of table : " .. #a)
for i = 1, #a do
    print(a[i])
end

 

* 전체 키와 값을 출력하기 파이썬의 enumerate와 유사하다.

 

인덱스(키)와 값을 출력한다. 여기서도 nil인 요소는 출력하지 않는다.

 

a = {2, "teach", 30, x="Hello", nil, y="Hash", nil}

for k, v in pairs(a) do
    print("key : " .. k .. " value : " .. v)
end

 

* 인덱스로 값을 출력하는 것은 이미 여러번 해봤다. 아래의 코드는 인덱스가 자동으로 생성한 것들을 출력한다.

 

키값이 별도로 있는 경우 출력하지 않는 것에 주의한다. 결국 for루프가 작동하는 방식도 배열처럼 한번에 싹 가져오는 방식이 아니라 키를 찾아서 값을 가져오는 방식으로 볼 수 있다. 중간 중간에 "x" , "y"와 같은 키나 nil들은 거르고 가져와야 한다.

 

다만 배열처럼 생성해서 사용하는 것은 가능하다. (내부 동작은 배열과 다를지라도)

 

a = {2, "teach", 30, x="Hello", nil, y="Hash", nil}

for i=1, #a do
    print("key : " .. i .. " value : " .. a[i])
end

 

* 테이블의 요소에 접근할 때 도트 . 연산자를 사용하는 것에 주의한다. 클래스가 아니라 테이블의 요소일 수가 있다.

 

* 테이블 라이브러리

 

테이블 라이브러리에서 몇가지 유용한 함수를 제공하므로 유용하게 사용할 수 있다. insert 함수의 경우 리스트에 요소를 입력할 때 사용할 수 있다.

 

a = {}
for i in io.lines() do
    table.insert(a, i)
end
print(#a)

for i=1, #a do
    print("line" .. i .. " : " .. a[i])
end

 

테이블의 결점과 위험요소에 대하여는 Lua documentation에도 설명이 되어 있고 해결책도 제시되어 있다. 이에 대하여는 루아의 Documentation을 참고할 수 있다.

Programming in Lua (first edition) 루아 다큐먼테이션 (API)

 

Programming in Lua (first edition)

Programming in Lua (first edition) This is the online version of the first edition of the book Programming in Lua, a detailed and authoritative introduction to all aspects of Lua programming written by Lua's chief architect. The first edition was aimed at

www.lua.org

 

* 테이블 자료형은 다른 언어와 차이가 있는 부분이기에 처음에 유심히 봐야할 것 같다.

공유하기

facebook twitter kakaoTalk kakaostory naver band