English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
테이블은 Lua의 데이터 구조 중 하나로, 다양한 데이터 타입(예: 배열, 딕셔너리 등)을 생성하는 데 도움을 줍니다.
Lua 테이블은 연관형 배열을 사용하며, 어떤 유형의 값도 배열 인덱스로 사용할 수 있습니다. 그러나 이 값은 nil이 될 수 없습니다.
Lua 테이블은 고정 크기가 아니며, 필요에 따라 확장할 수 있습니다.
Lua는 모듈(module), 패키지(package), 객체(Object)를 테이블을 통해 해결합니다. 예를 들어 string.format은 "format"을 사용하여 테이블 string을 인덱싱하는 것을 나타냅니다.
생성자는 테이블을 생성하고 초기화하는 표현식입니다. 테이블은 Lua에서 독특한 강력한 기능입니다. 가장 간단한 생성자는 {}입니다. 빈 테이블을 생성하는 데 사용됩니다. 배열을 직접 초기화할 수 있습니다:
-- 테이블 초기화 mytable = {} -- 지정된 값 mytable[1]= "Lua" -- 참조 제거 mytable = nil -- Lua 가비지 수집이 메모리를 해제합니다
table a에 요소를 설정하고 a를 b에 할당하면 a와 b이 같은 메모리를 가리킵니다. a가 nil로 설정되면 이 경우 b 또한 table의 요소에 접근할 수 있습니다. a에 지정된 변수가 없으면 Lua의 가비지 수집 메커니즘이 해당 메모리를 정리합니다.
다음은 위 설명을 시각화한 예제입니다:
-- 간단한 table mytable = {} print("mytable의 타입은", type(mytable)) mytable[1]= "Lua" mytable["wow"] = "수정 전" print("mytable의 인덱스 1 요소는 "", mytable[1]) print("mytable의 인덱스 wow의 요소는", mytable["wow"]) -- alternatetable과 mytable은 동일한 table을 가리킵니다 alternatetable = mytable print("alternatetable의 인덱스 1 요소는 "", alternatetable[1]) print("mytable의 인덱스 wow의 요소는", alternatetable["wow"]) alternatetable["wow"] = "수정 후" print("mytable의 인덱스 wow의 요소는", mytable["wow"]) -- 변수 해제 alternatetable = nil print("alternatetable는", alternatetable) -- mytable는 여전히 접근할 수 있습니다 print("mytable의 인덱스 wow의 요소는", mytable["wow"]) mytable = nil print("mytable는", mytable)
위 코드의 실행 결과는 다음과 같습니다:
mytable의 타입은 table입니다 mytable의 인덱스는 1 요소는 Lua입니다 mytable의 인덱스 wow의 요소는 수정 전 alternatetable의 인덱스는 1 요소는 Lua입니다 mytable의 인덱스 wow의 요소는 수정 전 mytable의 인덱스 wow의 요소는 수정 후 alternatetable는 nil입니다 mytable의 인덱스 wow의 요소는 수정 후 mytable는 nil입니다
다음은 Table 작업에서 자주 사용하는 메서드를 나열합니다:
순번 | 메서드 & 용도 |
---|---|
1 | table.concat(table [, sep [, start [, end]]]): concat은 concatenate(연결, 결합)의 약자입니다. table.concat() 함수는 매개변수에서 지정한 table의 배열 부분을 start 위치에서 end 위치까지의 모든 요소를 나열하며, 요소 간에는 지정된 구분자(sep)로 구분합니다. |
2 | table.insert(table, [pos,] value): table의 배열 부분에 위치(pos)에 value 값을 가진 하나의 요소를 삽입합니다. pos 매개변수는 선택적입니다. 기본적으로 배열 부분의 마지막에 삽입합니다. |
3 | table.maxn (table) table에서 모든 양수 키 값 중 가장 큰 키 값을 지정합니다. 양수 키 값을 가진 요소가 없다면 0을 반환합니다. (Lua5.2이 메서드는 이미 존재하지 않습니다. 이 문서에서는 사용자 정의 함수를 사용했습니다.) |
4 | table.remove (table [, pos]) table 배열의 pos 위치에 있는 요소를 반환합니다. 그 후의 요소들은 앞으로 이동합니다. pos 매개변수는 선택적입니다. 기본적으로 table의 길이입니다. 즉, 마지막 요소에서부터 지우겠습니다. |
5 | table.sort (table [, comp]) 주어진 table을 오름차순 정렬합니다. |
다음은 몇 가지 메서드의 예제입니다.
concat() 함수를 사용하여 목록의 요소를 결합된 문자열로 출력할 수 있습니다:
fruits = {"banana","orange","apple"} -- 결합된 table 문자열 반환 print("결합된 문자열 ",table.concat(fruits)) -- 지정된 결합 문자 print("결합된 문자열 ",table.concat(fruits,",")) -- 지정된 인덱스로 결합 ",table print("결합된 문자열 ",table.concat(fruits,",", 2,3))
위 코드를 실행하면 다음과 같은 출력 결과가 나옵니다:
결합된 문자열 ",bananaorangeapple 결합된 문자열 ",banana, orange, apple 결합된 문자열 ",orange, apple
다음 예제는 table의 삽입과 제거 작업을 보여줍니다:
fruits = {"banana","orange","apple"} -- 끝에 삽입 table.insert(fruits,"mango") print("인덱스는 4 의 요소는 ",fruits[4]) -- 인덱스에 삽입 2 의 키 위치에 삽입 table.insert(fruits,2,"grapes") print("인덱스는 2 의 요소는 ",fruits[2]) print("마지막 요소는 ",fruits[5]) table.remove(fruits) print("제거된 마지막 요소는 ",fruits[5])
위 코드를 실행하면 다음과 같은 출력 결과가 나옵니다:
인덱스는 4 요소는 mango입니다 인덱스는 2 요소는 grapes입니다 마지막 요소는 mango입니다 제거된 마지막 요소는 nil입니다
다음 예제는 sort() 메서드의 사용을 보여줍니다. 이는 Table을 정렬하는 데 사용됩니다:
fruits = {"banana", "orange", "apple", "grapes"} print("정렬 전") for k, v in ipairs(fruits) do print(k, v) end table.sort(fruits) print("정렬된 후") for k, v in ipairs(fruits) do print(k, v) end
위 코드를 실행하면 다음과 같은 출력 결과가 나옵니다:
정렬 전 1 banana 2 orange 3 apple 4 grapes 정렬된 후 1 apple 2 banana 3 grapes 4 orange
table.maxn in Lua5.2 그런 다음 이 메서드는 더 이상 존재하지 않기 때문에, 우리는 table_maxn 메서드를 정의하여 이를 구현했습니다.
다음 예제는 table에서 최대 값을 가져오는 방법을 보여줍니다:
function table_maxn(t) local mn = nil; for k, v in pairs(t) do if(mn==nil) then mn = v end if mn < v then mn = v end end return mn end tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5} print("tbl 최대값", table_maxn(tbl)) print("tbl 길이", #tbl)
위 코드를 실행하면 다음과 같은 출력 결과가 나옵니다:
tbl 최대값: 34 tbl 길이 3
주의:
table의 길이를 가져오는 때에는 #이나 table.getn을 사용하면 모두 인덱스에서 중단되어 table의 길이를 정확히 가져올 수 없습니다.
다음과 같은 방법을 대체할 수 있습니다:
function table_leng(t) local leng=0 for k, v in pairs(t) do leng=leng+1 end return leng; end