2015년 4월 20일 월요일

[루아] 논리 연산자 and, or, not

  루아는 C언어와 다르게 true, false 값만을 가지는 부울형이 있다. C언어에서는 내부적으로 0값을 거짓(false)으로 취급하지만

     ‘루아는 nil 과 false 만을 거짓으로 간주한다

는 점을 유의해야 한다. 정수 0도 루아에서는 진리값이 true이다. C언어에 익숙했다면 참 헷갈리기 쉬운 부분이다.

이 사실을 염두에 두고 루아의 논리연산자를 살펴보자. 루아의 논리연산자는 and, or, not 세 가지가 있다. 각각의 동작을 정리하면 다음과 같다.

  • not A - A가 거짓이면 (즉 nil 혹은 false이면) true, 아니면 false 반환
  • A and B — A가 거짓이면 (즉 nil 혹은 false이면) A를 바로 반환, A가 참이면 B를 반환
  • A or B — A가 참이면 (즉 nil도 false도 아니면) A를 바로 반환, A가 거짓이면 B를 반환

A and B 연산에서 A가 거짓이면 B는 아예 보지도 않고(계산도 안하고) 바로 A를 반환하며, 반대로 A or B 연산에서는 A가 참이면 B는 아예 보지도 않고 바로 A를 반환한다. 이것을 조금만 생각해 보면 not은 항상 부울값(true, false)을 반환하는데 반해서 and와 or는 그 반환값이 부울값이 아닐 수도 있다는 것을 알 수 있다. 몇 가지 예를 들어보면

local a = 1 and 0 — a에는 0값이 이 저장됨
local b = nil and 1 — b에는 nil 이 저장됨
local c = 1 or 0 — c에는 1값이 이 저장됨
local d = nil or 0 — d에는 0 이 저장됨

이것을 응용하면 예를 들어서 함수의 입력인자가 nil인지 아닌지를 따져서 내부변수를 다르게 초기화할 때 용이하다.

---------------------------------------------------
local function Func( xR, yR )
     local x, y
     if xR==nil then
          x = 0
     else
          x = xR
     end
     if yR==nil then
          y = 0
     else
          y = yR
     end
---------------------------------------------------

위와 같은 긴 코드를 다음과 같이 간단하게 한 줄로 줄일 수 있다.

---------------------------------------------------
local function Func( xR, yR )
     local x, y = xR or 0, yR or 0
---------------------------------------------------

또 다른 예로 어떤 테이블이 nil인지 아닌지를 따져서 그 내부 요소를 참조하고자 할 때도 유용하다. 예를 들면

---------------------------------------------------
local x = tLoc.x
---------------------------------------------------

의 경우 만약 tLoc 테이블 자체가 nil 인 경우에는 변수 x에 nil 이 저장되는 것으로 오해하기 쉬운데 실제로는 런타임 에러가 발생하고 프로그램이 멈추게 된다. 개인적으로 코로나로 코딩하면서 초기에 많이 접한 것이 이런 종류의 런타임 에러이다. (반면 tLoc 테이블 자체는 nil이 아닌데 x요소가 없는 경우에는 x에 nil 이 저장되고 런타임 에러는 발생하지 않는다.)
이러한 런타임 에러를 없애고 테이블 자체가 nil일 경우를 처리하려면 예를 들어서 다음과 같이 해야 할 것이다.

---------------------------------------------------
local x
if tLoc == nil then
     x = nil
else
     x = tLoc.x
end
---------------------------------------------------

위와 같은 코드를 and연산자를 이용하면 다음과 같이 한 줄로 바꿀 수 있다.

---------------------------------------------------
     local x = tLoc and tLoc.x
---------------------------------------------------

이와 같이 and 와 or 연산의 특성을 이용하면 프로그램을 간결하게 작성할 수 있다.

댓글 없음:

댓글 쓰기