로블록스 게임에는 체력, 레벨, 플레이어 수와 같은 데이터가 계속 변하게 됩니다. 이러한 데이터를 저장하여 필요할 때 확인과 변경을 할 수 있는 공간이 필요합니다. 이러한 공간에 해당하는 변수(variable)와 자료형 데이터에 대해 알아보겠습니다.
변수(Variable)
프로그램에서 데이터를 저장하기 위한 공간을 의미합니다. 변수에 저장된 데이터는 게임 제작 중 언제든지 불러오거나 변경할 수 있습니다.
변수에 대입하는 방법은 ‘변수 이름 = 자료형 데이터’ 형식으로 사용할 수 있습니다. 이렇게 변수에 데이터를 저장하는 것을 ‘선언(assign)한다’라고 표현합니다.
변수 사용 이유 및 안내 사항
변수의 이름만 알고 있다면 사용해야 하는 데이터를 언제든지 불러오거나 변경할 수 있기 때문입니다. 변수의 이름과 값을 통해 공동 작업을 하는 사람도 쉽게 이해할 수 있게 됩니다.
그러므로 변수의 이름은 저장된 데이터의 의미를 가장 잘 나타내는 이름으로 정하는 것이 중요합니다. 그리고 한 스크립트 안에서 같은 이름의 변수는 중복할 수 없으며, 몇 가지 안내 사항이 있습니다.
- 변수 이름에는 띄어 쓸 수 없습니다.
- 변수 이름은 길이 제한이 없고 문자, 숫자 및 밑줄로 구성될 수 있지만, 숫자로 시작할 수 없습니다.
- 루아 언어 자체에서 기본 설정된 ‘예약어’는 변수로 사용할 수 없습니다.
- 변수 이름은 대소문자를 구분합니다. RedBrick과 REDBRICK은 다른 이름으로 구분됩니다.
- 변수와 함수 이름은 동일하게 지정하지 않습니다.
로블록스 스크립트 작성 시 변수는 대문자로 시작하기보다 소문자로 시작하는 것이 도움이 됩니다. 대문자로 시작하는 것이 안 되는 것은 아니지만, 함수의 이름이나 오브젝트의 이름이 대부분 대문자로 시작해 혼동을 줄이기 위해 소문자 시작을 주로 사용합니다.
루아 언어 예약어
and, break, do, else, elseif, false, for, function, if, in, local, nil, not or, repeat, return, then, true, until, while
지역 변수와 전역 변수
변수는 사용되는 범위에 따라 지역 변수(Local Variable)와 전역 변수(Global Variable)로 나눠집니다. 지역 변수는 선언한 범위 안에서만 변수 활용이 가능하며, 전역 변수는 스크립트 전체에서 활용할 수 있습니다.
지역 변수로 선언된 변수는 변수의 이름을 알고 있어도 작성하고 있는 스크립트, 함수 등 지정한 범위 안에서만 사용할 수 있습니다. 변수 이름 앞에 예약어 중 하나인 ‘local’을 붙여 사용하면 지역 변수로 선언되며, 아무것도 쓰지 않으면 전역 변수로 선언됩니다.
전역 변수의 사용은 프로그램의 규모가 커지면 결국 버그를 만드는 원인으로 자주 지목됩니다. 그리고 속도도 지역 변수보다 느립니다. 로블록스가 기본으로 제공하는 전역 변수와 전역 함수 이외에는 특별한 이유가 없다면 지역 변수를 사용하는 것이 좋습니다.

자료형(DataType) 데이터
변수에 저장되는 자료형 데이터들은 숫자, 문자 등과 같은 다양한 형태를 가집니다. ‘캐릭터 이름’, ‘팀 이름’은 문자형 데이터이고, ‘레벨’, ‘시간’, ‘플레이어 수’ 등은 숫자형 데이터입니다. 그리고 ‘파트’와 ‘오브젝트’도 변수에 저장할 수 있습니다.
문자열(String)
문자를 나타내는 자료형 데이터입니다. 한국어나 영어, 숫자 등의 문자를 큰따옴표(” “)나 작은따옴표(‘ ‘)로 감싸 표현합니다. 숫자도 큰따옴표나 작은따옴표를 붙이면 문자로 인식하게 됩니다.
문자열 연산자: . .
루아 언어에서만 사용하는 연산자인 . . 연산자를 사용하면 두 개의 문자열을 하나로 합칠 수 있습니다. 승리한 팀의 이름 ‘dkei’과 ‘승리’라는 문자열을 합쳐 아래와 같이 표시할 수 있습니다.

플레이 버튼을 이용하여 출력 창에서 확인할 수 있으며 출력 창이 보이지 않는다면 ‘메뉴’ 바 ‘보기’ 탭에서 ‘출력’ 버튼을 선택하면 출력 창을 확인할 수 있습니다.
print() 함수
로블록스 스튜디오의 ‘출력’ 창에 내용을 표시하는 함수입니다. 게임을 플레이할 때는 표시되지 않지만, 게임 제작 시 스크립트 동작이나 오류를 확인하는 데 사용합니다.
문자열 연산자: #
문자열의 길이를 반환하는 데 사용하는 연산자입니다. 문자열 변수 앞에 붙여서 사용하면 문자열의 글자 수를 확인할 수 있습니다. 글자 수에는 공백도 포함됩니다.

글자 수는 10개지만 출력을 확인하니 11로 나옵니다. 공백이 포함되어 표시되기 때문입니다.
숫자(Number)
숫자로 표시되는 값을 나타내는 자료형 데이터입니다. 덧셈, 뺄셈과 같은 연산이 가능합니다. 변수에 숫자 데이터를 대입하여 레벨, 체력, 시간 등을 설정하거나 게임 규칙에 따라 여러 가지 값으로 연산할 수 있습니다.

주의 사항
문자열로 선언된 숫자의 경우 연산할 경우 자동으로 숫자로 변환시키지만, 문자로 인식되어야 하는 상황에 적용되기 때문에 오류가 발생할 수 있으므로 사용하지 않는 것이 좋습니다.
print(‘240’ + 1)
출력 값 241
닐(nil)
아무것도 아닌 것을 의미하는 자료형 데이터이면서 값입니다. 다음과 같은 상황에서 출력됩니다.
- 변수 선언 시 값이 들어가 있지 않을 경우
- 선언되지 않은 변수를 출력할 경우

이러한 특성으로 닐(nil)은 미리 선언했던 변수의 값이나 테이블을 삭제할 때 사용하기도 합니다. 이것을 응용하면 없어졌다 생겼다 하는 파트를 생성할 수 있습니다.
부울(boolean)
참(true)과 거짓(false)을 나타내는 자료형 데이터로 결과를 나타냅니다. 루아 언어에서는 아무것도 존재하지 않는 값인 닐(nil)과 거짓(false)을 제외한 모든 값은 참(true)으로 판단합니다.
부울로 표현된 결과로 조건문이나 반복문을 실행하거나 오브젝트의 속성을 변경할 수 있습니다.
type() 함수
변수의 자료형을 출력하는 함수입니다. print() 함수 안에 사용하면 데이터의 자료형을 확인할 수 있습니다.

테이블(Table)
여러 개의 데이터를 한 번에 관리할 수 있는 자료형 데이터입니다. 테이블을 사용하면 String, Number, nil, Boolean 등의 다양한 자료형을 한 번에 저장할 수 있습니다.
테이블은 중괄호{ }를 사용해 선언합니다. 데이터를 입력하지 않아도 생성할 수 있고, 초기 값을 지정하여 생성할 수도 있습니다. 테이블에는 배열과 딕셔너리 두 가지 형태가 있습니다.
테이블 배열(Table Array)
데이터를 쉼표(,)로 구분하여 작성합니다. 작성된 데이터들은 앞에서부터 순서대로 번호를 가지며 이 번호를 인덱스(Index)라고 합니다. 인덱스는 데이터 앞에서부터 1번부터 시작합니다.
데이터 찾기
하나의 테이블에 존재하는 인덱스는 고유한 값이므로 같은 테이블 안의 데이터가 동일한 인덱스를 가질 수 없습니다. 따라서 테이블 배열에서 데이터를 불러와 사용하고 싶을 때는 ‘테이블 이름 [인덱스 번호]’ 형식으로 원하는 데이터를 가져올 수 있습니다.
인덱스 번호를 이용하여 데이터를 찾는 과정을 ‘인덱싱(indexing)’이라고 부릅니다.

데이터 변경 및 추가
테이블 배열에 다른 값을 입력하거나 데이터를 변경하고 싶다면 인덱스를 활용합니다. 변경하고 싶은 데이터의 인덱스 번호를 찾은 다음, 변수에 대입하는 방법을 이용하여 변경할 수 있습니다.
인덱스에 데이터가 존재하는 경우에는 새로 대입한 값으로 변경되고, 데이터가 저장되지 않은 인덱스라면 데이터가 추가됩니다.
데이터가 없는 인덱스 출력
데이터가 없는 인덱스를 출력하면 nil 값이 출력됩니다. 이러한 점을 이용해 특정 테이블의 데이터를 제거하고 싶을 때는 nil을 대입하여 제거하기도 합니다.

배열의 길이를 모를 경우 삽입
배열의 마지막에 새로운 값을 추가하고 싶지만, 배열의 전체 길이와 마지막 데이터의 인덱스를 모른다면 문자열의 길이를 반환하는 # 연산자를 사용하거나 table.insert() 함수를 사용합니다.
#연산자
#연산자는 문자열뿐만 아니라 테이블에서도 사용할 수 있는 연산자입니다. 문자열에서는 문자의 길이를 반환하였다면, 테이블에서는 데이터의 전체 개수를 반환합니다.
이것을 이용하여 데이터의 수보다 1만큼 큰 인덱스에 원하는 값을 대입하면 테이블 배열의 마지막에 데이터를 추가로 입력할 수 있습니다.
table.insert() 함수
테이블에서 사용할 수 있는 함수로 table.insert(테이블 이름, 데이터) 형식으로 입력하면 테이블 배열의 마지막에 데이터를 입력할 수 있습니다.
테이블 마지막이 아닌 중간에 데이터를 삽입하고 싶을 경우에는 table.insert(테이블 이름, 인덱스 번호, 데이터) 형식으로 데이터를 삽입합니다. 이 형식을 이용하면 기존의 인덱스 번호에 있던 데이터는 자동으로 한 칸 뒤로 밀려나며 인덱스의 전체 길이가 늘어나게 됩니다.

테이블 배열 제거하기: table.remove() 함수
테이블 배열의 특정 값을 제거하고 싶을 때는 table.remove(테이블 이름, 인덱스 번호) 형식으로 원하는 인덱스 번호의 데이터를 제거할 수 있습니다. 제거한 인덱스의 다음 항목이 자동으로 앞으로 이동하면서 전체 인덱스의 길이가 줄어듭니다.
만약 nil 값을 대입하면 데이터의 값은 nil 값으로 변경되며 인덱스 길이는 그대로 유지되며, nil 값을 추가하면 인덱스의 길이는 늘어납니다.

테이블 딕셔너리(Table Dictionary)
테이블 딕셔너리는 단어의 의미처럼 사전을 떠올리면 이해가 쉽습니다. 사전에서 원하는 단어를 검색하면 그 뜻을 확인할 수 있는 것처럼 딕셔너리는 키(key)와 값(value)으로 구성되어 있습니다.
‘키’에는 이름, ‘값’에는 데이터를 입력하고 = 연산자를 이용하여 연결합니다. 원하는 데이터를 찾으려면 ‘테이블 이름[키]’의 형식으로 작성합니다. ‘값’에 ‘이름’을 부여하는 것으로 ‘키’를 출력할 때는 문자열로 출력해야 정상적으로 출력됩니다.
추가 및 수정
새로운 키와 값을 추가하거나 기존의 값을 수정하고 싶다면 키와 대입 연산자 = 을 이용합니다. 새로운 키와 값이 입력되며, 기존에 데이터가 존재한다면 입력한 대로 키의 값이 변경됩니다.
제거
키와 값을 제거할 때는 간단하게 키 값에 nil 값을 대입합니다. 딕셔너리는 배열과 달리 인덱스가 없고, 배열의 순서가 중요한 자료형 데이터가 아니기 때문에 nil을 대입해 간단하게 기존 값을 제거할 수 있습니다.

루아(LUA) 언어 배열 및 자료형 데이터 마치며
루아 언어가 다른 프로그램 언어와 다른 점은 배열의 맨 처음 데이터의 인덱스가 1이라는 점입니다. 다른 언어들의 배열은 대부분이 0부터 시작합니다.
개발자라면 특이하게 여길 수 있지만, 저처럼 일반 사람들에게는 1부터 시작하는 게 당연하다고 여길 수 있습니다.