1. 테이블 기초 오늘은 루아만이 갖고 있는 독특한 자료구조 테이블에 대해서 알아보겠습니다. 루아에서 테이블은 해쉬 테이블과 같은 자료 구조 이상의 역할을 합니다. 테이블은 객체지향적 프로그래밍을 가능하게 해주는 역할도 겹합니다. 무슨 이야기인지는 천천히 설명 드리겠습니다. 우선 간단하게 자료구조로써의 테이블을 살펴 보겠습니다. 해쉬 테이블로 사용하기 > HashT = {["a"] = 1, ["b"] = 2, ["c"] = 3, ["d"] = 4 } > print( Hasht["a"] ) 1 > print( Hasht["b"] ) 2 여기서 ["a"] 는 키 값으로 사용 되었고 1는 ["a"]에 맴핑 된 값으로 사용 되었습니다. 키 값은 단순히 값으로 말고 변수로도 사용 할 수 있습니다. > HashT2 = { a = 1, b = 2, c= 3} > print ( HashT2.a ) 1 대신 값으로 키값을 사용할때와는 다르게 변수에서는 테이블명에 . 로도 변수를 참조할 수 있습니다. HashT2["a"] 로도 참조 가능합니다. 만약 테이블을 만들 때 키값이 없다면 어떻게 될까요? 그럼 정수형으로 순차적으로 번호가 매겨집니다. 예를 들면 다음과 같습니다. > Fruit = { "apple","orange","banana" } > print ( Fruit[1] ) apple 그렇기 때문에 테이블은 배열로도 사용 될 수 있습니다. 그럼 배열에 추가적으로 insert 하고 remove 해 보겠습니다. > Fruit[ #Fruit + 1 ] = "grape" -- Fruit 의 아이템 갯수를 얻어 + 1을 해서 마지막 첨자를 구해 값을 대입한다. > print( Fruit[4] ) grape 이렇게 귀찮게 추가를 할 수도 있지만, 간단히 table.insert(Fruit,"kiwi") 처럼 간단히 할 수도 있습니다. 삭제는 table.remove(Fruit,4) 로 4번째 아이템을 삭제 할 수 있습니다. > table.insert(Fruit,"mango") > print(Fruit[6]) mango > table.remove(Fruit,6) > print(Fruit[6]) nil 그리고 만약 배열로 사용하는 테이블 내의 값들을 정렬하고 싶으면 table.sort를 사용하면 됩니다. > table.sort(Fruit) > for i = 1,#Fruit do print(Fruit[i]) end apple banana kiwi orange 2. 테이블과 함수 지금까지는 간단히 테이블을 자료구조로 사용하였는데, 루아에서는 거의 모든 것이 테이블의 키로 사용 될 수 있기 때문에 테이블과 함수를 연결 할 수 있습니다. >function Car(name) >> local car_name = name >> local function Go() >> print( car_name .. " is running" ) >> end >> return { Go = Go } -- 여기서 local function Go를 반환하므로 Car에 대한 맴버 함수로 사용할 수 있다. >> end > myCar = Car("SM3") -- Car 라는 함수를 통해 테이블을 만들고 테이블 내의 함수를 통해 객체 지향 코드 작성 > myCar.Go() SM3 is running > myCar:Go() SM3 is running 위의 예제만으로 객체 지향이라고 부르기 좀 부족한 면이 있는 것 같네요. 그럼 좀 더 객체지향적으로 바꿔 볼까요? > Car = {} > function Car:new (obj) >> obj = obj or {} >> setmetatable(obj, self) >> self.__index = self >> return obj >> end > mine = Car:new() 이렇게 만들면 좀 더 객체 지향적으로 만들 수 있습니다. 여기서 setmetatable이라는 함수가 나옵니다. metatable에 대해서는 다음 강의에서 설명하도록 하겠습니다. 3. 마무리 간단하게 테이블에 대해서 배웠습니다. 테이블은 루아에서 가장 중요한 타잎이고 더 다양하게 활용할 수 있습니다. 나중에 좀 더 깊이 테이블에 대해서 써 보겠습니다.