루아의 수 (number)

루아에서 사용하는 수(number) 즉 자료형에 대하여 알아보겠습니다.

 

루아의 5.2 버전까지는 모든 숫자들을 배정도 (double precision) 부동소수점으로 표현했습니다.

 

5.3 버전 부터는 64비트 정수형과 배정도 부동소수점을 사용합니다. 무슨 말이냐면 자료형을 크게 두 종류로 나누어서 사용한다는 뜻입니다. 자바 등 다른 프로그래밍 언어에 비하여 매우 간소한 방식입니다.

 

[루아에서 사용하는 두 종류의 수]

 

① 64비트 정수형 (정수형)

 

64비트 부동소수점 (실수형)

 

자바와 비교하면 자바는 int, long, float, doulbe 등 많은 자료형을 배워야하는데 루아는 매우 심플하게 두개만 놓고 사용합니다. 그것도 이전에는 소수점만 가지고 사용했습니다.

 

 

정수형은 연산속도가 빠르지만 표현범위가 제한되어 있고,

 

부동소수점은 연산속도가 느린 대신 수의 표현범위가 넓습니다.

 

아마 초창기에는 한개의 자료형을 통일해서 사용하다가 루아의 수요가 늘어나면서 정수형을 집어넣은 것 같습니다. 루아는 게임 스크립팅에 많이 사용하고 특히 최근에는 Roblox(로블록스)가 엄청난 인기를 끌면서 많이 소개가 되고 있습니다. 로블록스 스크립팅에 사용하는 루아 버전은 5.1 버전으로 다르지만 루아로 게임을 만들 수 있는 CoronaSDK, 러브2D등 별도의 프레임워크도 있습니다.

 

루아 인터프리터에 적응하기

 

루아의 인터프리터에서 수를 입력해봅니다. 스크립트 언어는 이렇게 한줄입력 후 엔터키를 누르면 바로 피드백이 있습니다. 그래서 인터프리터(번역기)라고 합니다.

 

특이한 것은 type로 형식을 구해봐도 정수형이나 부동소수형이나 number 로 표시합니다.

 

타입을 추측하고 대입하는 것은 루아 인터프리터가 하는 일로 사용자 입장에서는 그냥 숫자형을 사용하는 것 처럼 느끼죠. 형식적으로 출력되는 숫자에 소수점이 찍혀있냐 없는가를 보면 정수형과 실수형(부동소수점)을 구분할 수 있습니다. 저장 공간은 64비트로 같더라도 정수가 아무래도 더 빠르기 때문에 정수를 써야할 때는 정수를 써주는게 좋습니다.

 

 

16진수 형식의 숫자도 사용가능합니다. 0x 기호는 hex 값 (16진수)를 의미하는데 프로그래밍을 하다보면 자주 보게 되는 기호입니다.

 

기본 사칙연산

- 사칙연산의 경우 다른 프로그래밍 언어와 비슷합니다.

 

+ - * / 덧셈 뺄셈 곱셈 나눗셈

 

기본적인 사칙연산으로 사용합니다.

 

// 는 나머지를 제외한 몫을 반환합니다.

 

% 는 나머지를 반환합니다. (모듈로라고 함)

 

* 루아 인터프리터를 열고 계산기 처럼 사용해 보면 적응하는데 어렵지 않을 겁니다.

 

관계연산자 (비교연산자)

관계연산자는 두 값(항)을 비교해서 true 아니면 false를 반환합니다.

 

관계연산은 if 조건문이나 루프에서 자주 사용하게 되죠.

 

다른 언어들과 유사합니다만 ~= 정도만 주의하면 될 것 같습니다. ~= 은 NOT 같지 않다라른 뜻입니다.

 

기호 의미
a < b a는 b보다 작다
a > b a는 b보다 크다
a <= b a는 b보다 작거나 같다
a >= b a는 b보다 크거나 같다
a == b a는 b와 같다
a ~= b a는 b와 같지 않다

수학 관련 라이브러리 (Math)

math 라이브러리에 있는 수학 라이브러리를 사용할 수 있습니다. 절대값, 삼각함수 관련한 함수들이 있어서 유용하게 사용할 수 있습니다. 각각 함수의 사용방법에 대하여는 루아의 공식 Documentation 을 참조하도록 합니다. 어떤 매개변수를 사용해야 하는지 정도만 확인하면 사용할 수 있습니다.

* 루아 난수 생성하기(math.random)

 

아래의 코드는 1에서 10까지 난수를 생성합니다.

 

루아의 난수는 의사난수 (pseudo-random numbers) 입니다.

print("random number: ", math.random( 1, 10 ))

 

* 정수의 범위

64비트 정수를 사용하기 때문에 값의 범위는 2의 63승 -1 까지 표현가능합니다. 대략적으로 10의 19승 정도되는데 매우 큰 숫자 입니다.

 

math 라이브러리에 정수의 최대값과 최소값이 들어있는데, 이 숫자를 넘어서면 오버플로우가 일어나면서 숫자가 바뀝니다. 모듈로 연산의 결과와 같습니다. 오버플로우가 자주 일어나면 아무래도 64비트 모듈로 연산을 많이 해야하니까 성능에 좋지 않을 것으로 보이지만... 64비트를 오버플로우 시킬 정도의 변수를 많이 사용하지 않으면 됩니다.

 

오버플로우시 최대값 + 1 은 최소값과 동일하고 그 반대도 같습니다. 오버플로우 한다고 해서 값이 사라지거나 그러는 것은 아니라 64비트 정수형의 범위안에서 돌고 도는 것 입니다. 

 

print("MAX:    ", math.maxinteger)
print("MIN + 1:", math.mininteger - 1)

print("MAX + 1:", math.maxinteger + 1)
print("MIN:    ", math.mininteger)

 

형변환 Conversion

형변환은 정수형(Integer)과 소수형(Float)간의 관계에서 일어납니다.

 

소수형이 정수형보다 범위가 크기 때문 정수가 소수형으로 자동으로 형 변환합니다.

 

[소수형 + 정수형] => 소수형

 

 

2의 53승까지의 정수형은 정확한 배정도 부동소수점로 변환할 수 있는데 그 이상의 범위에서는 오차가 발생합니다.

 

형변환이 일어난 다음 비교연산을 할 때에 오차에 주의해야합니다.

 

루아 5.2까지는 정수형이 없었기 때문에 5.2에서 아래 버전에서 정수형을 사용하려면 호환성 문제가 발생합니다.

요약

루아의 수에 대하여 알아 봤습니다. 루아는 쉽고 빠르게 프로그래밍 하는 것에 초점이 맞춰있습니다.

 

해외에서는 초등학생이 루아를 사용해서 로블록스 게임 개발자로 활약하는 경우가 많습니다. 프로그래밍 언어라고 해서 너무 심각하게 생각하지 말고 초등학생도 충분히 할 수 있는 일이니 누구나 심각하게 고민하지 말고 재미있게 프로그래밍 하는게 좋습니다~ ! ㅎ

공유하기

facebook twitter kakaoTalk kakaostory naver band