문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 Lua (문단 편집) === 테이블 === Lua에서의 테이블은 배열 혹은 딕셔너리와 비슷하다고 생각하면 되는데, 아래와 같이 테이블을 선언할 수 있다. {{{#!syntax lua local t = {2, "a", true, a = 2, b = {2,5}} }}} 위의 테이블에서 키(key)가 정해진 원소들은 {{{t["a"]}}}나 {{{t.a}}}와 같이 사용할 수 있다. 그 외에 키가 배정되지 않은 원소들은 1부터 차례대로 인덱스가 매겨져서, {{{t[1]=2, t[2]="a", t[3]=true}}}가 된다. 테이블의 길이를 구할 때는 테이블 변수 앞에 연산자 {{{#}}}을 붙인다. 아래를 실행하면 테이블 {{{t}}}의 길이 {{{3}}}이 출력될 것이다. {{{#!syntax lua local t = {2,3,4} print(#t) -- #t = t의 길이 }}} 참고로 Lua에서 그냥 테이블을 {{{print(t)}}}와 같이 출력하면 테이블의 주소값이 나온다. Lua의 for-loop은 아래 예제와 같이 사용한다. {{{#!syntax lua local t = {1,2,4,5} for i=1, #t do print(t[i]) end }}} 변수 {{{i}}}가 1부터 {{{#t}}}까지 증가하며 테이블 {{{t}}}의 원소들을 인덱스 순서대로 출력한다. 아래 예제는 {{{pairs()}}} 함수를 이용한 Lua의 for...in 반복문이다. {{{#!syntax lua local t = {10,20,40,50} for i, v in pairs(t) do print("t[" .. i .. "]=" .. v) -- 문자열 합치기 연산자 '..' end }}} 위 코드를 실행하면 {{{t[1]=10}}}, {{{t[2]=20}}}, {{{t[3]=40}}}, {{{t[4]=50}}}가 순서대로 출력될 것이다. for...in 문에서 {{{i}}}는 인덱스, {{{v}}}는 현재 값을 의미한다. Lua에는 메타 테이블(Metatable)이라는 것이 존재한다. 먼저 메타 메서드(Metamethod)라는 것을 알아야 하는데, 메타 메서드는 테이블에 어떤 행동이 있었을 때 발생되는 이벤트이다. 메타 테이블은 아래와 같이 설정할 수 있다. {{{#!syntax lua local t = {} local mt = {} setmetatable(t, mt) }}} {{{setmetatable()}}}의 1번째 인자에 일반적으로 사용할 테이블을 넣고 2번째 인자에 우리가 메타 테이블로 설정할 테이블로 넣으면 된다. 메타 메서드에는 여러 가지가 존재하는데, 테이블끼리의 사칙연산, 테이블의 여러 함수를 사용, 테이블 강화, 테이블 상수화, 가비지 컬렉터, 테이블에 값이 없을 때 메타 테이블에서 가져오는 등 테이블의 기능 확장을 용이하게 한다. 이러한 메타 메서드는 아예 식별자로 등록되어있고, C++에서의 사용자 operator 정의와 비슷한 느낌이라고 볼 수 있다. 메타 메서드 중 두 가지만 소개하자면, 첫 번째로 {{{__index}}}는 테이블의 키에 해당하는 값이 없을 때[* 정확히는 Lua는 찾는 값이 없을 때 {{{nil}}}을 반환하기 때문에 '{{{nil}}}일 때'이다.] 실행된다. 아래는 {{{__index}}}에 대한 예제 코드이다. {{{#!syntax lua local t = setmetatable({}, { __index = function(self) return "없네요" end }) print(t.aff) }}} 위 코드는 사용자가 메타 테이블 {{{t}}}에서 없는 키 {{{aff}}}에 접근했을 때 메타 메서드 {{{__index}}}가 {{{"없네요"}}}를 반환하는 코드이다. 그래서 없는 키에 접근했을 때 원래는 {{{nil}}}을 반환해야 하는 것이 디폴트이지만, 현재 코드에서는 {{{"없네요"}}}가 반환값으로 정의되어 있으므로 {{{t.aff}}}에 접근하면 값이 {{{"없네요"}}}가 된다. 두 번째로 {{{__add}}}는 두 테이블이 더해졌을 때 실행된다. 아래는 {{{__add}}}에 대한 예제코드이다. {{{#!syntax lua local t1 = setmetatable({v = 5}, { __add = function(a,b) return a.v + b.v end }) local t2 = {v = 1} print(t1+t2) }}} 위 코드에서 메타 메서드 {{{_add}}}는 {{{t1}}} 테이블과 또 다른 테이블이 {{{+}}} 연산자로 연결될 때 각 테이블의 {{{v}}}값을 더해 반환하는 메서드로 정의되어있다. 이렇게 메타 테이블로 수많은 것들을 만들 수 있는데 좀 더 활용하거나 다른 메서드를 쓰면 더 짧고 더 좋은 코드를 짤 수 있다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기