[LUA] 테이블 다루기 - 배열/맵/클래스

2019. 7. 28. 13:35개발/LUA

루아는 기본 TYPE 말고는 테이블이 거의 모든 역할을 하고 있어 제대로 이해 하는게 필요 합니다 

루아 테이블에 대한 간단한 샘플 코드입니다 

print 결과는 소스 코드에 --> 주석으로 추가되어 있습니다 

-- 목적: 루아 테이블 공부하기 
-- print 의 결과는 --> 로 표시
function dumpTable(o)
    if type(o) == 'table' then
        local s = '{ '
        for k,v in pairs(o) do
            -- key 가 숫자가 아닌 경우 "key" 
            if type(k) ~= 'number' then 
                k = '"'..k..'"' 
            end
            s = s .. '['..k..'] = ' .. dumpTable(v) .. ','
        end
        return s .. '} '
    else
        return tostring(o)
    end
end


local listTable = {}

print('--------------------------------------------------------------------')
print('테이블을 배열/list처럼 사용하기')
print('--------------------------------------------------------------------')


-- 리스트 성격으로 초기화  
listTable = {"철수", "영희", "바둑이"}

print(dumpTable(listTable))
--> { [1] = 철수,[2] = 영희,[3] = 바둑이,} 

-- 숫자 배열 1,2,3 으로 접근 가능
print(listTable[1])
--> 철수

-- 리스트 순회 : 테이블은 1부터 시작 #table 은 테이블 항목 개수 리턴
for i = 1, #listTable do
    print(listTable[i])
end
-->
-- 철수
-- 영희
-- 바둑이


-- 리스트 순회 - key, value 는 pairs(table) 로 구한다.
for k, v in pairs(listTable) do 
    print(k, v)
end
-->
-- 1	철수
-- 2	영희
-- 3	바둑이

-- 리스트 마지막에 추가 
table.insert(listTable, '야옹이')
print(dumpTable(listTable))
--> { [1] = 철수,[2] = 영희,[3] = 바둑이,[4] = 야옹이,} 

-- 리스트 중간에 추가 - 바둑이 자리에 개구리 추가 
table.insert(listTable, 3, '개구리')
print(dumpTable(listTable))
--> { [1] = 철수,[2] = 영희,[3] = 개구리,[4] = 바둑이,[5] = 야옹이,} 

-- 개구리 제거
table.remove( listTable, 3)
print(dumpTable(listTable))
--> { [1] = 철수,[2] = 영희,[3] = 바둑이,[4] = 야옹이,} 



-- 리스트 안에 리스트 
listTable = {}
listTable = {
    {'한국', 'KOREA'},
    {'미국', 'AMERICA'}
}
print(dumpTable(listTable))
--> { [1] = { [1] = 한국,[2] = KOREA,} ,[2] = { [1] = 미국,[2] = AMERICA,} ,} 
-- 새 항목 추가 
table.insert(listTable, {'중국', 'CHINA'})
print(dumpTable(listTable))
--> { [1] = { [1] = 한국,[2] = KOREA,} ,[2] = { [1] = 미국,[2] = AMERICA,} ,[3] = { [1] = 중국,[2] = CHINA,} ,} 

-- 리스트 안에 리스트에 접근
print(listTable[3][2])
--> CHINA

print('--------------------------------------------------------------------')
print('테이블을 MAP 처럼 사용하기')
print('--------------------------------------------------------------------')
-- 테이블 초기화 1: 기본 ['key'] = value
local dicTable = {
    ['KOREA'] = '한국',
    ['AMERICA'] ='미국'
}
print(dumpTable(dicTable))
--> { ["AMERICA"] = 미국,["KOREA"] = 한국,} 

-- 테이블 초기화 2: key = value
local dicTable = {
    KOREA = '한국',
    AMERICA ='미국'
}
print(dumpTable(dicTable))
--> { ["AMERICA"] = 미국,["KOREA"] = 한국,} 

-- 새로운 key/value 추가 방법 table['key'] = value 또는 
-- table.key = value , 단 key 는 영어 알파벳만 가능
dicTable.CHINA = '중국'
dicTable['AUSTRALIA'] = '호주'
print(dumpTable(dicTable))
--> { ["CHINA"] = 중국,["AUSTRALIA"] = 호주,["AMERICA"] = 미국,["KOREA"] = 한국,} 
print(dicTable['CHINA'], dicTable.CHINA)
--> 중국	중국


-- key 존재 여부 체크
if dicTable['GERMANY'] == nil then
    print('key GERMANY not exist')
end
--> key GERMANY not exist

-- key 제거
dicTable.CHINA = nil
print(dumpTable(dicTable))
--> { ["AUSTRALIA"] = 호주,["AMERICA"] = 미국,["KOREA"] = 한국,} 

print('--------------------------------------------------------------------')
print('테이블을 구조체처럼 사용하기')
print('--------------------------------------------------------------------')
local studentTable = {}
studentTable.name = '철수'
studentTable.age = 18
studentTable.grade = {['영어'] = 90, ['수학'] = 80, ['국어']=100}
print(dumpTable(studentTable))
--> { ["age"] = 18,["name"] = 철수,["grade"] = { ["수학"] = 80,["국어"] = 100,["영어"] = 90,} ,} 


print('--------------------------------------------------------------------')
print('테이블을 클래스처럼 써 보자 ')
print('--------------------------------------------------------------------')
function studentTable:new(name, age)
    local instance = { 
        m_name = name,
        m_age = age, 
        m_grade = {['영어'] = 0, ['수학'] = 0, ['국어']=0} 
    }
    
    setmetatable(instance, self)
    self.__index = self
    
    return instance
end

objStudentA = studentTable:new('철수', 18)
objStudentB = studentTable:new('영희', 17)

print(dumpTable(objStudentA))
--> { ["m_name"] = 철수,["m_age"] = 18,["m_grade"] = { ["수학"] = 0,["국어"] = 0,["영어"] = 0,} ,} 
print(dumpTable(objStudentB))
--> { ["m_name"] = 영희,["m_age"] = 17,["m_grade"] = { ["수학"] = 0,["국어"] = 0,["영어"] = 0,} ,} 

'개발 > LUA' 카테고리의 다른 글

[LUA] TABLE 정렬(SORT)  (0) 2019.10.19
[LUA] 개발 환경 만들기  (0) 2019.09.30
[LUA] FOR 문  (0) 2019.09.29
[LUA] 함수 호출 CALL BY VALUE/CALL BY REFERENCE  (0) 2019.07.28
[LUA] 테이블 다루기 - 배열/맵/클래스  (0) 2019.07.28
[LUA] 문자열 다루기 간단 예제  (0) 2019.07.27

TAG