본문 바로가기
개발/LUA

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

by esstory 2019. 7. 28.

루아는 기본 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] 문자열 다루기 간단 예제 #2  (0) 2020.05.24
[LUA] TABLE 정렬(SORT)  (2) 2019.10.19
[LUA] 개발 환경 만들기  (3) 2019.09.30
[LUA] FOR 문  (2) 2019.09.29
[LUA] 함수 호출 CALL BY VALUE/CALL BY REFERENCE  (1) 2019.07.28
[LUA] 문자열 다루기 간단 예제  (2) 2019.07.27

댓글