English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua table(테이블)

테이블은 Lua의 데이터 구조 중 하나로, 다양한 데이터 타입(예: 배열, 딕셔너리 등)을 생성하는 데 도움을 줍니다.

Lua 테이블은 연관형 배열을 사용하며, 어떤 유형의 값도 배열 인덱스로 사용할 수 있습니다. 그러나 이 값은 nil이 될 수 없습니다.

Lua 테이블은 고정 크기가 아니며, 필요에 따라 확장할 수 있습니다.

Lua는 모듈(module), 패키지(package), 객체(Object)를 테이블을 통해 해결합니다. 예를 들어 string.format은 "format"을 사용하여 테이블 string을 인덱싱하는 것을 나타냅니다.

table(테이블) 생성

생성자는 테이블을 생성하고 초기화하는 표현식입니다. 테이블은 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 작업

다음은 Table 작업에서 자주 사용하는 메서드를 나열합니다:

순번메서드 & 용도
1table.concat(table [, sep [, start [, end]]]):

concat은 concatenate(연결, 결합)의 약자입니다. table.concat() 함수는 매개변수에서 지정한 table의 배열 부분을 start 위치에서 end 위치까지의 모든 요소를 나열하며, 요소 간에는 지정된 구분자(sep)로 구분합니다.

2table.insert(table, [pos,] value):

table의 배열 부분에 위치(pos)에 value 값을 가진 하나의 요소를 삽입합니다. pos 매개변수는 선택적입니다. 기본적으로 배열 부분의 마지막에 삽입합니다.

3table.maxn (table)

table에서 모든 양수 키 값 중 가장 큰 키 값을 지정합니다. 양수 키 값을 가진 요소가 없다면 0을 반환합니다. (Lua5.2이 메서드는 이미 존재하지 않습니다. 이 문서에서는 사용자 정의 함수를 사용했습니다.)

4table.remove (table [, pos])

table 배열의 pos 위치에 있는 요소를 반환합니다. 그 후의 요소들은 앞으로 이동합니다. pos 매개변수는 선택적입니다. 기본적으로 table의 길이입니다. 즉, 마지막 요소에서부터 지우겠습니다.

5table.sort (table [, comp])

주어진 table을 오름차순 정렬합니다.

다음은 몇 가지 메서드의 예제입니다.

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입니다

Table 정렬

다음 예제는 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 최대값

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