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.0207 sec