Post List

2017년 5월 26일 금요일

[ Lua ] 테이블

Table 자료형은 자료를 관리하기에 효과적인 복잡 자료구조로 연관 배열입니다. 다른 언어의 배열, 구조체, 리스트 등 어떠한 자료구조도 표현할 수 있습니다. 먼저 다양한 Table 선언 방법을 알아보도록 하겠습니다. [ Table 선언 방법 ] 비어있는 table을 생성하는 방법입니다. 테이블은 동적으로 할당 및 제거할 수 있으므로 변수를 생성만 해놓고 사용하는 경우도 빈번합니다. 테이블의 내용을 출력해보면 해당 테이블의 주솟값이 출력됩니다. 테이블 안의 내용을 출력하는 방법은 잠시 후 알아보겠습니다. 이번에는 배열처럼 사용하는 방법입니다. table을 생성할 때 콤마(,)를 구분자로 사용해 값을 여러 개 입력할 수 있습니다. 위와 같은 방법으로 값을 입력하면 인덱스 값을 0부터 시작하는 다른 언어와는 다르게 Lua는 1부터 시작합니다. 결괏값을 보시는 대로 인덱스 값 0번은 nil을 나타내고 있습니다. 이번에는 HashTable 또는 Dictionary와 비슷한 방법으로 사용해 보도록 하겠습니다. table 선언 시 값만 입력했던 이전과는 달리 'key = value' 형태로 값을 입력하였습니다. 위와 같이 key를 입력하면 table에서 해당 값을 가져오기 위해서는 '변수명[key]' 형태로 사용해야 합니다. 마지막으로 구조체처럼 혹은 사용자 마음대로 사용하는 방법입니다. 빈 table을 생성하고 마치 구조체로 정의된 변수에 접근하듯이 사용을 할 수도 있습니다. table 안에 새로운 table을 넣을 수도 있고 table 변수안에 함수를 넣을 수도 있습니다. 지금까지 보신 바와 같이 Lua의 table은 사용자 입맛에 따라 자유자재로 사용이 가능하기 때문에 강력하고 중요한 자료형입니다. 많이 사용해 보시고 table과 친해지시길 바랍니다. table의 선언 방법에 대해서 알아보았으니 이제는 table의 요소 추가, 삭제 및 기타 기능에 대해 알아보겠습니다.
[ Table 내용 출력하기 ] Key = Value가 아닌 배열처럼 인덱스를 사용하는 table의 경우에는 table.concat(list [, seq]) 함수를 이용해 내용을 출력할 수 있습니다. 첫 번째 인자로는 table 변수를 사용하고 두 번째 인자는 생략이 가능한데 해당 값을 입력할 경우 table의 값과 값 사이에 해당 문자열을 구분자로 사용하도록 합니다. 아직 배우지 않았지만 for loop를 이용해 출력할 수도 있습니다. 이러한 방법이 있다는 것을 보시고 추후 for loop를 알게 된다면 사용해 보시기 바랍니다. 또한, 위에 작성된 for loop의 ipairs 의 경우에는 인덱스를 사용할 경우에만 정상적인 출력이 가능합니다. 인덱스를 사용하는 table이 아닌 Key = Value를 사용하는 경우에는 pairs를 사용하여 출력할 수 있습니다. ipairs와는 달리 모든 요소를 순차적으로 순회하며 key와 value를 탐색합니다. (단, table 안에 존재하는 table까지 탐색하려면 별도의 코드를 작성해야 합니다.) [ Table 값 추가하기 ] 이미 생성되어 있는 table에 새로운 값을 추가하려면 table.insert (list, [pos,] value) 함수를 이용하면 됩니다. 첫 번째 인자로 table 변수를, 두 번째 인자인 pos는 생략이 가능한데 해당 값을 생략할 경우 table의 가장 마지막에 값이 추가되고, pos를 입력하면 해당 인덱스 위치에 value를 끼워 넣게 됩니다. [ Table 값 제거하기 ] table에 들어있는 값을 제거하는 방법도 추가하는 방법과 마찬가지로 두 가지가 존재하며 table.remove (list [, pos]) 함수를 이용합니다. 첫 번째 인자는 table 변수를, 두 번째 생략 가능한 인자는 제거하려는 값의 index 번호입니다. 두 번째 인자를 생략할 경우 가장 마지막에 있는 값을 제거하게 됩니다. 그리고 값을 추가할 때와 다른 점은 table.remove의 경우 제거하는 값을 반환합니다. 위 소스의 결과를 보시면 제거하는 값이 출력되는 것을 보실 수 있습니다. [ Table 값 개수 구하기 ] 인덱싱 되어있는 table의 경우 위와 같은 방법으로 요소의 개수를 확인할 수 있습니다. [ 값 정렬 ] table의 요소들을 table.sort (list [, comp]) 함수로 정렬할 수 있습니다. 첫 번째 인자를 table 변수, 생략 가능한 두 번째 인자는 정렬 방법을 커스텀 할 수 있도록 되어있습니다. 두 번째 인자를 생략할 경우 기본적으로 오름차순 정렬이 진행됩니다. 만약 내림차순을 사용하거나 별도의 방법으로 정렬을 하고 싶을 때는 두 번째 인자에 값 비교 루틴을 작성하여 정렬할 수 있습니다. 이상으로 table의 선언 및 추가, 삭제 그리고 자주 사용되는 함수에 대해서 알아보았습니다. table 자료형은 Lua를 사용하면서 자주 사용하게 되는 자료형 중에 하나로 다양한 방법을 사용해 연습해 보시기 바랍니다.