엔믹스 지우를 위한 코딩고수계정
[Skript] 2. 변수 (지역 변수, 전역 변수, 배열 변수) 본문
마인크래프트 1.20.4 버전을, 플러그인도 해당 버전을 기준으로 작성되었습니다.
애드온 : Skacket, SkBee, Skellett, SkQuery, skript-reflect, skRayFall
*해당 게시글에 적용된 문법이 오류가 난다면 플러그인 버전이 달라 일어난 이슈일 가능성이 높습니다.
*게시글에 나오는 일부 함수들은 개인적으로 분류한 함수로 따로 추가해야 합니다.
퀘스트를 깼어! 근데 이 사실은 어디에 저장되는 거야?
오늘은 변수에 대해서 알아보고자 한다. 너무나도 개발하는 데에 필수적인 개념이라 굳이 알아야 하나라고 할 수 있다. 그러나 오늘 이 게시물로 변수에 대한 모든 내용은 다 끝내고자 한다. 앞으로 변수는 절대로 잊지 못할 거다 싶을 정도로 최대한 간단히, 그러나 꼼꼼히 알아보고자 한다.
변수란?
변수는 "변하는 수"이다. 굳이 숫자가 아니어도 되는데 어쨌든 우리는 변한다에 초점을 두고자 한다.
또 다른 정의로 "창고"이다. 어떠한 데이터를 저장하기 위한 공간으로서 동작하는 게 변수다.
말로만 설명하면 이해가 되지 않는다. 코드로 봐보자.
on load 는 우리가 스크립트 문서를 수정하고 다시 로드할 때 쓰는 마인크래프트 명령어 "/sk reload (파일명).sk"를 입력했을 때 실행되는 코드이다. 이벤트에 대한 것은 추후 배울 것이니 지금은 그런가보다하고 넘어가자.
set {plus} to 0
변수를 선언, 즉 이런 변수를 만들게요하는 문법은 이와 같다. plus 라는 이름의 변수에 0이라는 숫자로 초기화하였다. 초기화라는 이름이 상당히 중요하다. set은 plus라는 변수에 어떤 값이 있든 상관없이 무조건 to 뒤에 있는 요소로 초기화한다는 의미이다.
on load에서 썼긴 하나 어떤 코드에도 다 쓸 수 있다.
message "plus is %{plus}%" to player
익숙한 친구가 보인다. 퍼센트 % 기호. 저 기호가 다시 어떤 것이라 하였는가? 이름이 아닌 모습을 보여주세요하는 기호였다. 변수도 마찬가지로 {plus}라는 이름을 가지고 있고 이 친구의 모습인 0(이전 on load에서 초기화된 모습)으로 나타난다.
add 1 to {plus}
말 그대로 plus 변수에 1을 추가해주세요이다. set이랑 위치가 달라서 헷갈릴 수 있는데 나는 이렇게 외웠다.
1을 {plus}에 (to) 추가해주세요 (add)
{plus}를 0으로 (to) 초기화해주세요 (set)
이래도 잘 모르겠으면 그냥 쓰다보면 외워진다. 초반에 나도 많이 헷갈렸으니 헷갈린다고 코딩 어렵네 접어야겠다는 생각은 버리자. 어차피 다 그런 과정을 겪고 고수가 된 것이니 말이다.
코드 실행

plus의 값이 0이고, 1이 추가되었다고 나온다. 한 번 더 입력해볼까? 그러면 어떻게 될까? add 1 to {plus}에 의해서 다음 출력은 "plus is 1"이라고 예상된다.

예상대로다.
변수의 저장
변수를 다루는 실습에서 이런 호기심이 든다.
"오, 커맨드 실행할 때마다 증가하는 건 알겠는데, 이거 마크를 꺼도 계속 남아있는 거 아님?"
정확하다.
해당 변수는 전역 변수라고 한다. 스크립트 플러그인에서 정확한 명칭인진 모르겠지만 통상적으로 개발 상에서 쓰는 용어로 외우고자 한다. 용어를 잘못 알면 나중에 다시 기억하면 된다. 우리는 개념에 대해서만 집중하자.
전역 변수는 어떤 커맨드, 이벤트, 함수든 상관 없이 공유하는 변수를 의미한다. 우리가 더 이상 /plus 명령어를 실행하지 않으면, 서버 데이터가 소멸되지 않는 이상 저 변수는 영원히 1이다.
다른 사람이 /plus 커맨드를 쓰면 어떻게 되나? 동일하게 {plus} 변수를 사용하며 2가 될 것이다.
이를 통해 알 수 있는 건 변수는 서버 상에 존재하는 데이터 창고이다. 개인에게 부여된 창고가 아닌 서버의 것이다.
지역 변수
다음의 코드를 보자.
arg 1과 arg 2를 더한 값을 그냥 출력해주는 매우 단순한 코드이다. 뭐가 문제지? 실행해볼까?

매우 정상적으로 나온다.
그럼 이 코드를 왜 소개했을까? 바로 변수의 공간에 대해서다. 우리 저 코드에서의 {plus}를 자세히 봐볼까?
전역 변수는 서버의 공유된 창고이다. 어떤 장소에 plus라는 이름의 창고가 생긴 것이고 그 안에 값이 들어간 것이다. 그런데 잘 생각해보자. 저 {plus} 변수는 끝까지 존재해서 남아야 할 가치가 있을까? 코드 상에서 두 수를 더하고 출력하고, 그 이후에는 쓸모가 없어진다. 정확히 말하면 매번 다른 값이 되고 값을 보존하지 않아도 큰 문제가 없다.
그래도 문제는 없긴 하다만, 굳이 끝까지 남아도 되지 않아도 되는 요소를 창고라는 공간을 차지해야 할까? 공간 낭비다. 어찌되었든 변수는 서버 데이터의 한 자리를 차지한다. 이게 쌓이고 쌓이다보면 서버에는 쓸데없는 용량만 늘어나게 된다.
이런 상황에서 필요한 것이 바로 지역 변수이다.
지역 변수는 임시 변수라고 생각하면 된다. 하나의 커맨드, 이벤트, 함수 안에서만 존재하는, 그 코드가 끝이 나면 더 이상 존재하지 않는 변수가 바로 지역 변수이다.
코드는 굳이 실행하지 않겠다. 위와 정확히 동일한 결과가 나온다. 차이점은 변수의 생김새이다.
{_plus}
지역 변수는 전역 변수의 이름에서 앞에 언더바 _ 기호를 붙이는 것으로 선언할 수 있다. 언더바로 시작하는 모든 변수는 전부 지역 변수라고 생각하면 된다.
이렇게 되면 plus 변수는 커맨드 /plus 가 실행되고 잠깐 생성되었다가 모든 코드가 실행되면 사라진다.
배열 변수
예를 들어보자. 학생들의 이름을 저장하고 싶다. 그러면 어떻게 변수에 저장할 건가?
우리가 아는 바로는 이렇게 저장할 것이다. 그런데 좀 더 효율적으로 관리할 수 있는 방법이 있지 않을까?
큰 주제에 대해서 비슷한 요소를 관리하도록 하는 변수가 바로 배열 변수이다.
{student::*}
이와같이 콜론 : 기호를 두 개 이용해서 배열 변수를 선언할 수 있다.
정확히 말하자면 {배열의 이름::하위 요소의 이름} 이다. 쉽게 이해하기 위해서 우리는 배열 변수를 "창고와 상자" 개념으로 이해하도록 하자.
원래 변수를 선언하는 것을 우리는 "창고"라는 장소를 부여한다고 했다. 배열 변수도 창고인 건 매한가지이다. 그러나 하위 요소들은 그 창고 안에 있는 "상자"라고 생각하면 쉽다.
그림으로 표현해볼까?

미안하다 그림 못그린다.
뭐 저렇게 큰 student라는 창고에 1, 2, 3, 4 라는 상자가 있는 형태이다. 각 상자 안에 이름을 넣은 것이라 보면 된다.
설명하지 않았는데 당연히 배열 변수도 맨 앞에 하이픈을 넣어 지역 변수로 선언할 수 있다.
그래서 저거 왜 씀?
효율적으로 관리하는 차원이 가장 크다.
나는 다음의 이유에서 사용하는데
1. 해당 카테고리 전체를 삭제할 필요가 있다면 배열 변수 자체를 삭제하면 된다.
이런 적이 한 번 있었는데, 더 이상 사용하지 않는 컨텐츠의 변수들을 삭제할 때 그냥 배열 변수 그 자체를 삭제하였다.
배열 변수 그 자체는 위의 예시로 했을 때 {student::*} 라고 한다. 이게 창고 이름이다. {student}와 다른 것이니 주의하자!
2. 새로운 요소를 추가하기 좋다.
위의 코드에서 만약 학생 한 명이 추가된다면 우리는 어떻게 할까? 명령어로 자신의 이름을 넣어서 추가한다고 가정하자. 명령어로 입력하는 것이기에 코드 상에서 적어놓을 수 없다. 즉 "set {student5} to "이몽룡"" 이런 식으로 할 수 없다는 것이다. 저게 5번째 학생인지 모른다.
그럴 때 다음의 코드로 작성하면 된다.
arg 1은 입력한 이름일 것이고, 우리는 몇 번째 요소인지 모르니 그냥 배열 변수에다가 넣는 걸로 처리한다. 이런 상황 때문에 배열 변수를 사용한다.
3. 요소를 체크해서 관리하는 코드를 작성하기 좋다.
추후 배울 loop, 즉 반복문이라는 것을 쓰기 매우 좋다. 학생들을 다 조사해서 특정 이름을 가진 학생을 뽑아낼 것이다. 그럴 때 일반 변수로 했으면 일일이 코드에 박아넣어서 해야 하고, 추후 학생이 계속 추가되었을 때 관리하기가 매우 힘들다.
배열 변수로 처리했기에 그 배열을 하나하나 순회하는, 즉 loop를 돌아 학생이 몇 명이든 상관 없이 처리할 수 있게 된다.
이 내용은 나중에 나올 반복문에서 자세히 다룰 것이기에 아직 이해가 안 되는 것이 당연하다. 3번 내용은 그냥 아 그런 게 있구나 하고 넘어가자.
마치며
생각보다 길어진 거 같다. 다음 포스트는 변수에 관한 심화 과정에 대해 다룰까 한다. 변수를 다루면서 위의 개념은 꼭 필수적으로 알아야 하고, 위의 내용만 알아도 개발하는 데에 아직은 큰 지장은 없을 것이다. 그러나 앞으로 더 큰 개발을 하고, 실제 유저들을 대상으로 서버를 만들 때 추가적인 개념이 필요하여 심화 파트로 분류를 하겠다.
사실 한 포스트에 다 담기에 투머치할 거 같아서 분리했다. 그냥 그렇구나하고 넘어가길 바란다.
그럼 우리 오래봐요!
'[Skript] 공부' 카테고리의 다른 글
| [Skript] 4. 자료형 (2) | 2024.11.19 |
|---|---|
| [Skript] 3. 변수 심화 (2) | 2024.11.16 |
| [Skript] 1. 커맨드와 커맨드 옵션 (Command, Command's Options) (4) | 2024.11.08 |