LUA[강좌] C,C++ 을 아는사람을 위한. 루아의 시작..|

"루아를 이용한 민첩하고 효과적인 게임 개발" - 류광 역 - 서적을 통해 학습한 내용을 복습 및 지식공유를 위해 작성합니다.

루아는 포르투갈어로 을 뜻한다.

스크립트에 대한 정의라던지 약관을 늘여놓은듯한 글은 생략한다...

1.루아 콘솔 프로그램

-첨부파일에 루아 콘솔 프로그램이 있다. (LuaConsole.exe)

- 간단한 코드 및 한줄로 실험해 볼만한것이라면 콘솔을 이용하면 된다.

sample code1

for indx=1,4 do print("line: ", indx) end

sample code2

for indx=1,4 do

print("line: ", indx)

end

청크(chunk)란!? : 루아에서는 하나의 명령 또는 일련의 명령들(스크립트 파일 전체 등)을 칭함.

잘 모르겠지만.. 청크라는 용어를 앞으로 많이 쓰일 모양입니다.

2. 주석처리..

- c 에서는 // , /* */ 두가지 방법을 사용하지요..

- 루아에서는 -- , --[[ --]] 두가지 방법을 사용합니다.

--[[ --]] 이녀석들... 마음에 안드는군요 -_-; --[[ ]]-- 이게 좀 더 그럴싸 했을텐데..

=> 류광님께서 글을 쓰셨더군요 ^^

제가 말한 --[[ ]]-- 이게 좀 더 그럴싸 했을텐데.. 라는 표현은,

대칭된 모습이 이쁘지 않을까? 라는 조크인데 오해를 샀네요 ㅎㅎ

08.10.8 - 문득 생각나서 적어봄..

3. lua 파일을 만들어 실행해보자!!

helloworld.lua 파일 작성

-- disc : hello world

myString = "Hello World"

print(myString)

※메모장으로 하면 안된다는 말을 얼핏 줏어들은것 같습니다.

울트라에디터, vc, 에디터플러스 등으로 하면 될겁니다.


드디어 헬로우월드를 마스터 했군요 :)

4. 자료형

- 루아는.. 플래시의 스크립트와 비슷하다. 정해놓고 쓰는 자료형이 없다.

즉, int iNum = 3; 이 아닌 iNum = 3 이라 하면 된다..

그렇지만, iNum = "삼이다" 이와같이 자료형 자체가 변할 수 있다..

- nil, bool, 문자열, 수치, 테이블 이와 같은 종류가 존재한다.

- type() 함수를 통하여 그래도 정체를 좀 알 수 있다니.. 다행이군요..

5. nil 과 local

- nil 과 local 이라는 특이한 녀석들이 있다..

- nil : 일종의 null 이라 생각하면 간단할것 같다..

Value = nil -- 변수를 삭제한다!? 삭제란 존재 자체가 지워지는가에 대해서는 잘 모르겠다..

- local : 지역 변수를 선언할때 사용

우선 루아는 기본적으로 모두 전역변수이다.

지역변수로 사용하기 위해서는 local 을 사용해야 한다

sample code 1

function Sample()

myDat_1 -- 전역변수가 된다..

local myDat_2 -- Sample 함수가 끝날때 소멸된다

end

sample code 2 ( 아래 for 문에 자세한 원리를 설명한다 )

function Sample(recvDat) -- recvDat 는 자동으로 지역변수가 된다. local 을 붙여줄 경우 오히려 에러를 낸다.

for local i = 1, 10 do-- 오류 for 문에 쓰이는 변수는 자동으로 지역변수가 된답니다... 일관성이 조금 부족하군요

end

6. 테이블

- ex) myTable = { 1, 2, 3, 4, 5 } myTable[1] 은 1입니다... c 의 배열과는 종이 한장 차이군요

myTable[6] = 6 이와 같이 컨테이너의가변 성향을 갖고 있군요

- 테이블은 일종의 포인터이다. 진짜 정체를 가르키는 포인터라 생각하면 된다.

그러므로 테이블간의 비교연산 등을 할 수 없다.

sample code)

tableA = [1, 2, 3]

tableB = [1, 2, 3]

if tableA == tableB then

print( " 같다 " )

else

print( " 틀리다 " )

eld

결과는 '틀리다'tableA 와 tableB 가 갖는 포인터는 다르기 때문이다.

- 배열을 사용하는 방식처럼 for 문 등을 돌려 비교해야 하는가 봅니다

7. 논리 연산자

- 일반적으로 우린 && || 두가지를 사용 하곤 하지요

- 그 뜻 또한 잘 아시다시피 그리고 와 또는 입니다.

- 책에서는 괜히 복잡하게 설명했다 생각되는군요.. 바로 예제 들어갑니다.

--------------------------------------------------------------------------------

sample code1

a = 5

b = 10

c = 20

if ( a < 10 ) and ( b < 20 ) then

print ( "true" ) ;

else

print ( "false" ) ;

end

위의 코드는 결과적으로 true 입니다.

c 코드로 표현을 해볼까요~

if ( a < 10 && b < 20 )

{

// .....

}

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

sample code2

if ( a < 10 )or ( b <1 ) then

print ( "true" ) ;

else

print ( "false" ) ;

end

위의 코드에서 a < 10 는 참입니다. 그렇지만 b < 1 은 거짓입니다. 결과는 true 입니다.

우리가 알다시피 or 연산자로 인해 1 0 = 1 이 되는군요~

c 코드로 표현을 해볼까요~

if ( a < 10 || b <1 )

{

// .....

}

--------------------------------------------------------------------------------

- not 연산자

이것 역시 책에서는 알송달송한 설명이다... 바로 c 코드로 확인해 보자.

if ( 0 ) // 이것은 0 이므로 if 문 안에 들어가지 않을것이다..

{

}

if ( 100 ) //if 문의 동작 원리는 아시다시피 0 이 아니면 들어가는 것이다.

{

}

그렇다면 not 은 무엇인가!?

if ( ! 100 )// 0은 1로 변하게 되고 0 이 아닌것은 0 이 되버린다... 그러므로 ! 1000 이 된다.

{

}

c 코드에서의 자주 쓰이는 방법이다.

#define FALSE 0

#define TRUE 1

static bool bFlg= FALSE ;

bFlg != bFlg ; // 결과는 FALSE -> TRUE 가 된다.

bFlg != bFlg ; // 결과는 TRUE-> FALSE가 된다.

bFlg != bFlg ; // 결과는 FALSE -> TRUE 가 된다.

bFlg != bFlg ; // 결과는 TRUE-> FALSE가 된다.

if ( bFlg ) // bFlg 가 0 이 아니라면 if 문 속으로 들어갈 것이다.

{

// .......

}

if ( ! bFlg ) // bFlg 가 0 과 같다면 if 문 속으로 들어갈 것이다. 이것은 if ( bFlg == 0 ) 과도 같은 식이다.

{

// .......

}

결과적으로 not 연산자는 c 에서 ! 와 같은 원리이다.

간단한걸 너무 어렵게 설명했나요? ㅜ_ㅜ

이것으로 논리 연산자 라는 녀석을 마칩니다.

8. while 문과 repeat 문

- while : 루아에서의 while 문은 c 와 사용법이 동일하다. 좀 더 구체적인 설명은 while 문으로 검색하여 c 에서의 사용법을 참조.

sample code

indx = 1

while indx < 10

do

print ( " loop pass: ", indx )

indx = indx + 1

end

- repeat : 루아에서의 repeat do while 문과 같은 원리이다. 일단 한번은 하고 보자는 식이다 :)

sample code

indx = 1

repeat

print ( " loop pass: ", indx )

indx = indx + 1

until indx > 10

- 결론 : while 문은 do end 로 이뤄지며 repeatrepeat until 이 사용된다.

9. 우리의 호프 for

- 무슨 말이 필요하랴 샘플 코드로 바로 들어갑니다.

sample code1

for indx = 1, 10

do

print ( indx )

end

c code

for ( int indx = 1 ; i <= 10 ;i += 1)

{

printf ( indx ) ;

}

첫 예제에 보면 indx = 1, 10 이라 되있다. 1 부터 10 까지 인데 증가치는 얼마인지 보이질 않는다.

일종의 증가치를 생략한 경우인데 기본값 1 이 증가된다. 이것 역시 일관성이 부족하다...

sample code2

for indx = 10, 1,-1

do

print ( indx )

end

c code

for ( int i = 10 ; i >= 1 ; -- i )

{

printf( indx ) ;

}

for loop = 0 , 100 , 1

do

-- ...............

end

loop 변수는 for 문이 끝남과 동시에 소멸한다.

이는, 지역변수의 성질에 대해 이해가 필요하다.

c 코드로 보는 지역변수의 개념 정복

void SampleFunc()

{

{

int i =0 ;

for ( ; i < 100 ; ++ i )

{

printf ( " %d", i ) ;

}

} // int i = 0 ; 변수 i 는 이 라인을 통과 함으로써 지역변수로써 존재가 소멸된다.

i = 200 ; // error

{

int i = 1 ; // ok 위의 int i = 0 ; 과는 별개의 지역변수이다.

// ......

}

}

위의 코드는 빌드 되지 않는다.

컴파일러는 i = 200 ; 이라는 부분에서 오류를 낼것이다. i 는 존재하지 않기 때문이다.

이에 따른 지역변수의 완벽한 이해개념 역시 c, c++ 등의 언어를 통해 연마해야 할 것이다..

10. break

- c 와 용도 및 원리가 동일하다.

※ C, C++ 에선 없는것..

- "1" + 1 은 2 가 됩니다.

- "1 + 1 " 은 문자열로 "1 + 1" 이 됩니다.

- "abcd" + 1 은 오류를 냅니다.

※ 이러한 형의 선언이 없는것들끼리 섞이는건.. 혼선이 일어나는건 아닐련지..

- if a ~= b then 이와 같은 문법은 c 에서 표현할 경우 if( a != b ) 가 된다. (부등)

이 외의 다른 관계연산은 c 와 같다.

※루아에서 없는것..

- 루아는 나머지 연산자 ( % ) 가 존재 하지 않는다. ( 이게 얼마나 중요한건데 --; )

차기 버전에 추가될 것이라 한다. ( 5.0 이하 버전엔 없음 )

- switchcase 가 없다.. 이로 인해 if 신공만이 만병통치약이 되겠군요

TIP

◈ 단정도 실수형 float 4 바이트 -1.2E - 38 ~ 3.4E38

◈ 배정도 실수형 double 8바이트 2.2E - 308 ~ 1.8E308

- 현재 루아 5.0 에는 배정도 부동소수점만 쓴답니다.

- 그렇지만 컴파일시 단정도 부동소수점을 사용하도록 설정하는것이 가능하다 합니다.

- 루아 5.1 버전에서 정수 형식이 추가될것이라 하는군요..

3.14e8 ( 3.14 * 10의 8승, 314,000,000 == 3.14 * 100,000,000 )

3.14e-2 ( 3.14* 10의 -2승, 0.314 == 3.14 * 0.1 )

최근 업데이트 : 2006. 1. 13

작성자 : 되엔자앙 ( 권진영 ) - rpna@korea.com

from - http://cafe.naver.com/createwindow.cafe

정보란 공유를 위함이다. 수정 및 배포는 자유입니다.

다만, 출처를 분명히 하며 절대 상업적 목적에 사용될 수 없습니다.

대한민국이 강해질 그날까지..

+ Recent posts