반응형

Mixed table constructor , 즉 혼합형 테이블 이라 할 수 있습니다.

말로는 이해가 어렵습니다.

 

우리는 table을 이용해서 dictionary 를 구성할 수 있음을 알았습니다. dictionary 에는 키가 있고 그 키에 저장되는 값이 있습니다.

 

table.key = 값

일반적으로 dictionary 는 키의 자료형태, 즉 데이터 타입이 같은 형태(정수면 정수, 문자열이면 문자열 등등)를 사용합니다.

그러나 루아의 table은 이러한 키의 형태가 같지 않아도 됩니다.

또한 순차적이지 않아도 됩니다.

 

다음의 예를 살펴보독 하죠.

 

t = { 2,4,6, language="Lua", version="5.1" }
for k,v in pairs(t) do print(k,v) end

for i,v in ipairs(t) do print(i,v) end

결과는

1 2
2 4
3 6
language Lua
version 5.1


1 2
2 4
3 6

 

위에서
앞의 for 문에 의해서는 정수로 인덱스(순차적)된 내용과 language, version 으로 명명된 키의 값들도 나옵니다.

그러나 뒤의 for 문에 의해서는 정수로 인덱스된 순차적인 것들만 나옵니다.

이는 pairs() 와 ipairs 의 차이에 의해서 발생하는 결과 입니다. 이 두가지의 차이는 추후 다시 설명하기로 하고

일단 여기서는 하나의 table에 서로 다른 형태의 순차적이지 않은 값들을 동시에 사용할 수 있다는 것 입니다.

c 나 c++ 프로그램을 하다보면, 가끔 위의 형태를 만들기 위하여 노력할 때가 있습니다.

즉 어떠한 데이터 집단을 만들고 그 데이터 집단의 이름과 특징들을 적어놓을 공간을 만들기 위하여 구조체나 class 의

구조화된 형태를 다소 복잡하게 만들어 사용하게 됩니다.

 

이런 경우 루아의 table은 쉽게 그 형태를 구성하도록 해 줍니다.

반응형

일단 Dictionary 란 무엇인가를 알아보도록 하죠.

STL 을 아시는 분은 map 같은 것이죠.

 

Java, C# 등에서도 제공 됩니다.

 

언듯 들으면 전자사전? 정도로 생각할 수 있습니다. 의미적으로 비슷합니다.

프로그램을 만드는데 있어서 dictionary 라는것이 무엇인지 알아보도록 하죠.

 

가령 우리가 전국 지역번호(전화의) 를 참조하는 것이 필요하다고 할때,

 

지역번호는 정해져 있습니다. 즉 바뀌기 어렵죠. 다만 그 값을 사용하는것이 매우 빈번 하게 발생 합니다.

즉 어떠한 정보가 있으면 정보의 내용을 갱신하는 빈도와 , 그 정보들중 필요한 것을 찾아 사용하는 것의 방법으로

정보에 접근하는 형태가 나뉘어 집니다.

이는 우리가 영어사전이 그 내용자체는 바뀌는것이 드물며(어떤 정보는 평생 변하지 않을수도 있음) 단지 모르는 영어단어를

찾아보는 경우가 훨씬 많다는 것 입니다.

 

이러한 경우에 우리는 이러한 정보를 위의 사용에 보다 효과적으로 대처할 수 있도록 자료들을 보관하는 방법을 찾습니다.

이러한 경우에 사용하는 방법이 dictionary 입니다. 일종의 자료구조의 하나이지요.

 

루아에서 이러한 dictionary 형태를 table 을 이용하여 만들 수 있습니다.

 

아래의 정보가 있다고 생각해 봅니다.

 

서울 = 02

경기 = 031

인천 = 032

강원 = 033

부산 = 051

충남 = 041

대전 = 042

제주 = 064

 

지역번호는 더 많지만 일단 이것으로...

 

C에서 배열 또는 리스트로 위의 내용을 저장하여

만일 충남의 지역번호는? 이란 질문이 들어올때 배열을 쭉 찾아서 충남이 나올때까지 돌려 해당 값을 찾겠죠.

아니면 STL 의 map 과 같은 형태로 코딩을 할 수 있겠죠?

 

루아에서는 테이블을 이용합니다.

 

ddd = {["서울"]="02", ["경기"]="031", ["인천"]="032", ["강원"]="033", ["부산"]="051", 
      ["충남"]="041", ["대전"]="042", ["제주"]="064" }

 

print(ddd["제주"])
print(ddd["서울"])

 

이렇게 검색할 수 있다는 것 입니다.

 

여기서 table은 table[key] = 값, 형식으로 키로 사용하는 것이 문자열일 수 있고 아니면 멤버 변수일 수 있습니다.

키가 영문자일경우는 [ ] 를 사용하지 않아도 됩니다.

 

 

ddd = {seoul="02"}


print(ddd["seoul"])

 

 

또한 아래와 같이 객체의 접근형태(c 에서의 구조체 연산자)로 접근할 수도 있습니다.

ddd = {seoul="02"}


print(ddd.seoul)

 

위와 같이 table을 이용하여 dictionary 의 구조적 문법을 사용할 수 있습니다.


종합예제:


d = {s="02", k="031", i="032", g="033", b="051", 
c="041", d="042", j="064" }



print(d.c)
print(d.s)

출력값:041
02



반응형

루아에서의 테이블은 매우 중요한 내용이다.

테이블은 매우 독특하며 그 사용면에서 광범위하다.

루아의 객체지향성을 위하여 사용되기도 한다.

 

table 생성

table명 = {}

 

예)

t = {}

테이블은 위와 같이 {} 에 의하여 초기화 된다. 그냥 table 변수를 생성한다고 보면 된다. 단 {} 로 하면 테이블로 선언 되지만 그 내용은 비어 있다고 보면 된다.

 

 

배열로서의 테이블

 

테이블을 이용하여 배열을 표현할 수 있다. 테이블을 생성할 때 배열의 각 요소들을 콤마(,) 로 구분하여 정의 할 수 있다.

또한 배열의 각 요소들은 대괄호 [ index ] 에 의하여 인덱싱되어 접근할 수 있다.

 

t = { 1,1,2,2,3,4,5,5 }

print( t[1] )

 

결과

1

 

테이블의 인덱싱은 1부터 시작한다. c/c++ 에서 배열의 첫번째 값은 인덱스 0 에 있지만 루아에서는 1에 있다.

 

t = { 1,1,2,3,5,8,13 }

은 다음과 같은 문장과 동일하다.

t[1]=1 t[2]=1 t[3]=2 t[4]=3 t[5]=5 t[6]=8 t[7]=13

테이블의 크기 알아내기

테이블의 크기는 # 연산자를 이용하여 알아낼 수 있다.

 

t = { 1,1,2,3,5,8,13 }
print(#t)

 

결과

7

참고적으로 위의 # 연산자는 다음과 같은 table 함수로 대치할 수 있다.

t = { 1,1,2,3,5,8,13 }
print(table.getn(t))

테이블에 값 추가하기

 

테이블에 다음과 같은 테이블 함수를 이용하여 값을 추가할 수 있다.

table.insert(t,21)

 

table.insert 함수는 인수가 2개 또는 3개를 사용한다.

table.insert(table,value)              -- 테이블의 끝에 추가
table.insert(table,position,value)  -- 테이블의 특정 위치에 추가

 

테이블에서 특정 위치의 값 지우기

table.remove(table,position)


반응형

보통 C 의 경우 main() 함수를 둡니다.

즉 실행파일이 만들어지고 이를 실행하면 어딘가 진입 코드부분이 있어야 겠죠.

이곳이 바로 C언어 에서의 main 함수 입니다.

 

루아는 이러한 진입 함수가 있지 않습니다.

 

그러나 이러한 단점을 보안하기 위하여 LuaWin 은 main 이라는 함수를 자동으로 호출하도록 만들었습니다.

 

function main()

 

end

 

라는 함수고 lua code에 있으면 이를 자동으로 호출해 준다고 생각하면 됩니다.

단 이는 LuaWin 에서만 적용되는 사항입니다.

또한 main 함수에 인수는 적용하지 않습니다.

 


main 함수가 있으면 특별히 호출하지 않아도 자동으로 호출 된다.

 

반응형

루아의 특징하나를 살펴봅시다.

 

루아에서는 함수도 하나의 변수 입니다.

 

다음의 예를 살펴보죠.

 

function myfunc()

print("테스트 문자열")

end

 

a = myfunc

 

a()

 

위와 같이 하면 어떻게 될까요??

a() 라는 함수 호출에 결국 myfunc() 가 호출 됩니다.

그러므로 consol 에는

 

 테스트 문자열

 

이라고 나오겠죠..

 


[루아스크립트]


+ Recent posts