루아는 C또는 파스칼과 거의 비슷한 형태인 전통적인 문장 구조를 제공한다.
이러한 문장 구조로는 배정문, 제어구조 프로시저 호출이 있다.
또한 루아는 다중 배정과 지역 변수 선언과 같은 특이한 문장 구조도 제공한다.

1. 배정
배정문은 변수 또는 테이블 필드에 값을 변경하는 기본적인 방법이다.
a = "hello" .. "world"
t.n = t.n +1

--다음 문장은 a에 10을 b에 2*x를 넣는다
a, b = 10, 2*x

x, y = y, x -- 'x'와 'y'를 교환
a[i], a[j] = a[j], a[i]  --'a[i]'와 'a[j]'를 교환
-- 스왑 함수가 필요 없겠다..

a, b, c = 0, 1
print(a, b, c)   --> 0 1 nil
a, b = a+1, b+1, b+2   -- b+2값은 무시된다
print(a, b) --> 1, 2
a, b, c = 0
print(a, b, c) -->0 nil nil
-- a, b, c 같은 경우 c언어에서의 a = b = c = 0 이런 문법과 혼동 될수 있으므로 주의

-- 변수들을 한번에 초기화 하려면 각각 값을 제공해야한다.
a, b, c = 0, 0, 0
print(a, b, c)
위와 같은 다중 배정문을 사용할 일이 거의 없지만
swap이나 함수로부터 여러 반환값을 모아야할때 필요하다..라고
책에서 말하고 있다 아직 함수는 진도가 나가지 않아 잘 모르겠지만



2. 지역 변수와 블록
루아는 전역변수와 별도로 지역 변수를 제공한다. local 키워드를 사용하여 지역변수를 생성할수 있다.
j = 10  -- 전역변수
local i = 1 -- 지역변수

-- C언어에서의 블록은 { } 이것이지만
-- 루아에서는 do end사이를 블록으로 처리하고 있다

x = 10
local i = 1 -- 지역으로 선언했지만 결국은 전역변수

while i <= x do
   local x = i*2  -- while 본체에 대해서 지역변수
   print(x)         --> 2, 4, 6, 8, ..
   i=i+1
end

if i > 20 then
   local x            -- "then" 본체에 대해서 지역변수
   x = 20
   print(x + 2)     -- (if 문의 조건이 참이면 22를 출력)
else
   print(x)           --> 10 (전역변수)
end
print(x)              --> 10 (전역변수)

do
   local a2 = 2*a
   local d = (b^2 - 4*a*c)^(1/2)
   x1 = (-b + d)/a2
   x2 = (-b - d)/a2
end                                           -- 'a2'와 'd'의 유효 범위 끝
print(x1, x2)



local a, b = 1, 10
if a< b then
   print(a)   --> 1
   local a    -- '=nil'이 생략
   print(a)   --> nil
end
print(a, b)   --> 1   10
왠만하면 전역변수보다는 지역변수를 사용하는 것이 좋다
책에 보면 지역변수를 사용하는것이 더 빠르게 작동한다고 나와있다.
(내생각에도 지역변수를 사용하는것이 메모리 면에서도 낫을것같다)



3. 제어구조
루아는 작고 전형적인 제어 구조를 제공한다. 조건부 실행을 위한 if 문, 반복을 위한 while, repeat, for문이 그것이다.
if, for, while문은 end로 끝나며, repeat문은 until로 끝난다.

중요!!!!!  루아는 0과 빈 문자열 둘다 참으로 처리 한다!  (false와 nil을 제외한 모든 값은 참이다!)

(이책이 좀 이상한게.. if문을 배우기도 전에 이미 예제글에 if문을 사용한다;;
아마도 이책를 보는 거의 모든 사람이 다른 언어를 배우고 루아를 배운다고 생각하는것 같다.) 
if문
 if a<0 then a = 0 end

if a < b then return a else return b end

if line > MAXLINES then
   showpage()
   line = 0
end
-- if 문은 결과에 따라 then 또는 else부분을 실행한다.

if op == "+" then
   r = a + b
elseif op == "-" then
   r = a - b
elseif op == "*" then
   r = a * b
elseif op == "/" then
   r = a / b
else
   error(invalid operation")
end
-- 위 코드는 elseif를 사용하는 예이다.
-- switch문은 없는 듯 하다.. 불편하네;
while문
while문은 조건을 검사한다. 조건이 거짓이면 반복문을 종료 한다.
local i = 1
while a[i] do
   print(a[i])
   i = i + 1
end
repeat문
repeat문은 해당 조건이 참이 될때까지 본체를 반복 실행한다
-- 비어 있지 않은 첫 입력줄을 출력
repeat
   line = io.read()
until line ~= ""
print(line)
-- C언어의 do~while문과 비슷하지만 조건이 참이 되면 루프를 빠져나온다(조건이 반대)

local sqr = x/2
repeat 
   sqr = (sqr + x/sqr)/2
   local error = math.abs(sqr^2 - x)
until error < x/10000                       -- 'error'는 여기서도 여전히 유효
수치 for문
for문은 수치for문과 일반 for문의 두가지 사용 방법이 있다.
수치 for문은 다음과 같은 문법으로 표현한다.

for var = exp1, exp2, exp3 do
   <코드>
end

C언어의 for문을 바꾸면
 for(int var = exp1; var < exp2; var+=exp3)
{
}
과 같다...(var<exp2인지 var<=exp2인지는 확인해봐야 한다)
 for i=1, f(x) do print(i) end

for i=10, 1, -1 do print(i) end

-- 만약 상한선을 두지 않고 반복하려면, math.huge상수값을 사용하면 된다.
for i=1, math.huge do
   if (0.3*i^3 - 20*i^2 - 500 >= 0) then
      print(i)
      break
   end
end
※for문 사용시 주의 할점
첫째, 이 세 표현식은 모두 반복이 시작하기전에 한번만 계산된다. 예를 들면 f(x)는 시작할때 딱 한번만 호출된다.
둘째, 제어 변수는 자동으로 for문 안에서 지역변수로 선언되므로 반복문 안에서만 보인다.
예)
for i=1, 10 do print(i) end
max = i          -- "for i = 1"은 이미 사라졌다. max의 값은 전역 변수 'i'의 값 이거나 'nil'이 될것이다.
셋째, 제어 변수의 값은 절대로 변경하면 안된다. 변경한다면 예측할수 없는 결과가 나올수 있다.

일반 for문
일반 for 반복문은 반복자 함수에서 반환된 모든 값을 훑는다.
-- 'a' 배열의 모든 값을 출력(print)
for i, v in ipairs(a) do 
   print(v)
end
-- 루아 기본 라이브러리는 배열의 값을 훑기 위한 간단한 반복자 함수를 제공한다.
-- 반복 될때마다 i는 색인을 얻고 v는 해당색인에 맞는 값을 얻게 된다.

-- 테이블의 모든 색인을 훑는 방법은 다음과 같다.
-- 't' 테이블의 모든 키를 출력
for k in pairs(t) do 
   print(k) 
end
4. break와 return 문
break와 return문은 블록에서 빠져나가고자 할때 사용된다.
break문은 반복문을 빠져나갈때 사용되고
return문은 함수에서 결과를 반환할때, 그리고 종료 시킬때도 사용된다.
문법적인  이유때문에 break와 return문은 블록의 마지막에 두어야 한다.

 예)
function foo ()
   return --<<문법 오류
   -- 'return' 은 다음 블록에서 가장 마지막 문장이 된다.
   do return end   --정상
   <다른 문장들>
end



끝!!
이글의 내용은 "Programming in Lua"라는 책의 내용을 보고 적은 것입니다.
신고

'Programming > Lua' 카테고리의 다른 글

[Lua] 1부(언어) 5장. 함수 개요  (3) 2011.07.25
[Lua] 1부(언어) 4장. 문장  (0) 2011.07.21
[Lua] 1부(언어) 3장. 수식  (0) 2011.07.17
[Lua] 1부(언어) 2장. 루아 타입과 값  (0) 2011.07.16
[Lua] 1부(언어) 1장. 시작하기  (0) 2011.07.16
by Ergate 2011.07.21 10:46
| 1 2 3 4 5 |

티스토리 툴바