본문 바로가기
카테고리 없음

LUA 살펴보기..1

by 철이아부지 2008. 12. 15.

LUA는 스크립트 언어이다. 다른 언어에서의 바인딩을 손쉽게 할수 있기 때문에 게임등의 스크립트로 많이 사용된다고 한다.

내가 쓸만한 언어인지 우선 매뉴얼을 정독하며 정리해보자

 

고전적인 HelloWorld

print("Hello, World")

세미콜론이 사용되지 않고, 각 블럭이 end로 묶이는 형태라 C에 익숙한 내게는 그닥 끌리지 않는다.

하지만 세미콜론을 사용한다고 해서 오류가 나는 것은 아니고, 특히 한 라인에 여러 statement를 작성할때는 구분자로서 ; 를 사용한다.

 

dofile을 이용하여 다른 lua 파일들을 끌어 올수 있다. 스크립트을 쪼개고, 재활용 가능하니 장점. +1

null 처럼 nil 이라는 것이 있는데 global 변수의 경우 nil을 사용하여 해제 할수 있다.

casesensitive 하므로 변수 사용에 주의해야 한다. (나에게는 장점)

-- 라인 주석 이고, --[[ ]]-- 은 블럭 주석이다.

독립적인 interpreter를 제공한다. 디버깅 등을 할때 편리하다고 한다. 일단 스크립트를 내장하는 것이 목표이긴 하지만 뭐든 있으면 좋은거다.

 

기본적인 data type

nil, boolean, number, string, userdata, function, thread, table

type 명령을 이용하여 변수의 종류를 알아낼수 있다.

number를 할당한 변수에 다시 string을 할당할 수 있다. (동적 타입이다. JavaFX같은 경우는 이게 안된다. 나에게는 동적 타입 지원은 단점. 오류 유발이다.)

[[, ]] 를 이용하면 인용문이 가능하다. (즉 안에서 Enter 코드를 마구 때린 문자열 작성이 가능하다는 이야기) SQL 문등을 사용하기 적합하다.

문자열은 .. 로 더한다. 문자열에 + 를 하면 number로 형변환 하여 더해 버린다. 형변환이 안되는 값이라면 오류 난다. 즉 거꾸로 이야기 하면 .. 를 이용하는 경우 어떤 타입이던 문자열로 바꿔서 더해버린다는 말.

table 은 자바의 hashmap 같은 녀석인데, 재밌는 점은 Array가 없기 때문에 array도 table을 이용하여 구현한다는 것이다.

a = {}; -- 테이블 형 변수 생성

a[0] = 1;

a[1] = 2;

a["x"] = "x";

a.x = 1;

a.y = 2;

세미콜론 찍어대는건 버릇이라 어쩔수 없는듯

table에 있는걸 분리해 내려면 for문과 ipairs를 사용한다.

for i, line in ipairs(a) do

    print( i..":"..line);

end;

여기서 재미난점.

i는 반드시 number 인가 보다. x:x 는 출력되지 않는다. 재미 없나?;;

만약 table의 모든 데이터를 iterate 하려면 어떻게 해야 하는지 연구 필요.

 

lua에서의 첫번째 클래스 값. 이라는데, 그 이유는 함수 안에서 변수를 저장할 수 있고, 다른 함수에 인자로써 전달 될수 있기 때문이란다. 객체 지향적인 구현을 위한 꽁수 인듯. 뒤에서 더 보자.

lua로 만든 함수와 C로 만든 함수 모두 호출 가능하다. lua의 모든 표준 라이브러리는 C로 만들어 졌다.

userdata를 이용하여 C의 데이터를 lua 변수에 저장할 수 있다. 뒤에서 더 보자

 

산술 연산

+ - * / 이렇게 있고, number에 대하여 사용 가능하다. 앞에 이야기 한대로 number가 아니면 number로 변환한다. 변환 안되면 오류

 

비교 연산

< > <= >= == ~= 위와 같이 사용한다. ~= 이건 C에서 != 하고 같은 것. 결과는 boolean타입인 true, false 이다.

다른 type 데이터 간의 비교는 무조건 false다. 그러니까 tostring, tonumber 등을 이용하여 형변환 하여 비교하자.

 

논리 연산

and or not

초기화 때 이런 코드를 많이 쓴다네.

x = x or v --if not x then x = v end

두개의 문장은 같다고 한다. x가 nil이면 v를 할당한다는 의미

C에서의 a ? b : c 의 경우 a and b or c 라고 쓴다는데, 이건 도대체 이해 못하겠다. 간단하게 쓰는것도 좋지만 이런식으로 코드가 암호화 되면 알아보기 힘들다구.

not은 true, false 를 뒤집는 것.

 

문자열 연산

.. 로 문자열을 붙인다. 숫자에 .. 찍으면 문자열로 변환하여 더한다.

 

연산자 우선 순위

^

not

*  /

+  -

..

<  > <= >= ~= ==

and

or

우선순위는 속편하게 괄호를 이용하여 묶자.

 

테이블 생성자

a = {1,2,3,4,5};

이렇게 하면 a[1] == 1, a[2] == 2 다. 즉 0베이스가 아닌 1 베이스로 값이 시작한다.

a={x=0, y=1};

이건 a.x==0, a.y==1 이다.

 

할당

뭐 이건 = 이건데.. 이런게 된다

a,b = 1,2;

a,b=b,c; -- a와 b값 바꾸기.

a,b,c=1,2; 이렇게 하면 c==nil 이다.

함수는 값을 여러개 반환할 수 있다. (헉!) 따라서 a,b = function(c); 이렇게 할수도 있다는 이야기.

 

로컬 변수와 블럭

아무데서나 변수 만들면 그건 글로벌이다.

로컬 변수는 local 이라는 키워드로 선언

do - end 를 이용하여 블럭을 만들수 있다.

 

흐름 제어

if 조건 then

elseif 조건

else

end

 

while 조건 do

end

 

repeat

until 조건

 

for index=식1, 식2, 식3 do

end

for문의 경우 재밌다.index 변수는 저절로 생성되는 로컬 변수이다. 식2 의 값과 index값보다 커지면 for문을 빠져나가고 exp3는 루프식 한번 실행 후 실행된다.

만약 식3을 생략하면 index를 자동으로 1씩 늘려준단다. (자동은 싫다. 간단해 보이더라도 오류 유발성이 있다.)

 

루프문은 break로 빠져나올수 있다. return을 사용하면 loop위쪽으로 복귀하는듯. C에서의 continue? (너무해.. return을 이런 키워드로 사용하다니..)

return이 continue처럼 사용된다는건 오해였다. function을 끝내고 값을 반환하는 용도가 맞다!

 

for index, value ipairs(tableVar) do print(value) end

아까 나온 ipairs다. 테이블을 배열로 보고 인덱스가 숫자인것만 찍어 준다. 전체 다 찍으려면 pairs를 사용한다. (ipairs의 i가 그 의미였구나..)

 

함수 부터는 내일 본다. ㅡ.ㅡ; 힘든데 MBC 뉴스까지 속을 뒤집어 놓는다. 전국토를 공사장화 하잔다. 역시 삽질만이 살길?