E D R , A S I H C RSS

LUA_5

1. 테이블 기초

오늘은 루아만이 갖고 있는 독특한 자료구조 테이블에 대해서 알아보겠습니다. 루아에서 테이블은 해쉬 테이블과 같은 자료 구조 이상의 역할을 합니다. 테이블은 객체지향적 프로그래밍을 가능하게 해주는 역할도 겹합니다. 무슨 이야기인지는 천천히 설명 드리겠습니다. 우선 간단하게 자료구조로써의 테이블을 살펴 보겠습니다.

해쉬 테이블로 사용하기

HashT = {a = 1, b = 2, c = 3, d = 4 }
print( Hashta )
1
print( Hashtb )
2

여기서 a 는 키 값으로 사용 되었고 1는 a에 맴핑 된 값으로 사용 되었습니다. 키 값은 단순히 값으로 말고 변수로도 사용 할 수 있습니다.

HashT2 = { a = 1, b = 2, c= 3}
print ( HashT2.a )
1

대신 값으로 키값을 사용할때와는 다르게 변수에서는 테이블명에 . 로도 변수를 참조할 수 있습니다. HashT2a 로도 참조 가능합니다.

만약 테이블을 만들 때 키값이 없다면 어떻게 될까요? 그럼 정수형으로 순차적으로 번호가 매겨집니다. 예를 들면 다음과 같습니다.

Fruit = { "apple","orange","banana" }
print ( Fruit1 )
apple

그렇기 때문에 테이블은 배열로도 사용 될 수 있습니다. 그럼 배열에 추가적으로 insert 하고 remove 해 보겠습니다.

Fruit #Fruit + 1 = "grape" -- Fruit 의 아이템 갯수를 얻어 + 1을 해서 마지막 첨자를 구해 값을 대입한다.
print( Fruit4 )
grape

이렇게 귀찮게 추가를 할 수도 있지만, 간단히 table.insert(Fruit,"kiwi") 처럼 간단히 할 수도 있습니다. 삭제는 table.remove(Fruit,4) 로 4번째 아이템을 삭제 할 수 있습니다.

table.insert(Fruit,"mango")
print(Fruit6)
mango
table.remove(Fruit,6)
print(Fruit6)
nil

그리고 만약 배열로 사용하는 테이블 내의 값들을 정렬하고 싶으면 table.sort를 사용하면 됩니다.
table.sort(Fruit)
for i = 1,#Fruit do print(Fruiti) 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. 마무리
간단하게 테이블에 대해서 배웠습니다. 테이블은 루아에서 가장 중요한 타잎이고 더 다양하게 활용할 수 있습니다. 나중에 좀 더 깊이 테이블에 대해서 써 보겠습니다.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:37
Processing time 0.0202 sec