Profile
Experience

2018.12.17

GML 차근차근 배워보기. [ 2 ] 변수 (2)

조회 수 8 추천 수 0
애드블럭을 꺼주시면 서버 운영에 도움이 됩니다.
부탁드립니다.

GML 차근차근 배워보기

 

* 게임메이커 8.0을 기준으로 작성된 강좌입니다.

[ 2 ] 변수

 

 

4. 변수 가림

 

이전 시간에 변수 범위에는 코드 범위, 인스턴스 범위, 글로벌 범위의 세 가지가 있다고 했다. 통용되는 범위의 넓은 정도로 따지면 코드 범위 < 인스턴스 범위 < 글로벌 범위 라고도 이야기했는데, 이러한 계층적인 관계 때문에 '변수의 가림'이라는 현상이 발생한다. 우선 다음 예제를 본 다음 설명을 하도록 하겠다.

 

 일단 새로운 프로젝트를 만든 다음, 아래 스크린샷처럼 간단한 스프라이트 하나, 이 스프라이트가 적용된 오브젝트를 하나 만든다.

 

 

 

만들고 나서, '생성할때' 이벤트를 만든 다음, 아래와 같은 코드를 작성한다.

 

globalvar n;

n=5;

 

 

 

 이전 시간에 배웠듯이, 글로벌 범위의 변수 n을 선언하고, 그 n에 5라는 값을 대입하는 코드이다. 다음으로 왼쪽 마우스 버튼 이벤트를 만든 다음 아래와 같은 코드를 작성한다.

 

var n;

n=3;

show_message(n);

 

 

 

 이 코드는 코드 범위의 변수 n을 선언한 뒤, n에 3 값을 대입하고 n을 출력하라는 코드이다. 그렇다면 여기서 문제가 생긴다. 아까전에 생성할 때 글로벌 범위의 변수 n을 선언하고, 왼쪽 버튼을 눌렀을 땐 코드 범위의 변수 n을 선언했다. 두 변수 n의 이름이 모두 똑같은데, 그렇다면 왼쪽 버튼을 눌렀을 때 n에 3을 대입하고, 화면에 n을 출력하는 코드는 어떤식으로 동작하게 될까?

 

정답은 '3'이 출력되며, 이 때 코드 범위의 변수인 n에 의해 글로벌 범위의 변수 n이 가려지는 현상이 발생한다.

 

 

 

 어느 범위든 상관없이, GML에서 같은 이름의 통용범위가 다른 변수 두 가지가 명확한  범위의 지정 없이 사용될 경우, 항상 통용범위가 더 좁은 변수를 가리키게 된다. 따라서 위의 코드는 아무런 문제가 없으며, 정상적으로 '3'이라는 코드가 출력된다.

 

 여기서 의문점이 생길 수 있다. 그렇다면, 코드 범위 변수와 이름이 겹치는 글로벌 범위의 변수를 해당 코드에서 쓰고 싶을 때는 어떻게 해야 할까?

 

 이 때 필요한 것이 global. 이다. 바로위의 코드에서, show_message(n); 을 show_message(global.n); 으로 바꿔보자.

 

 

 

 이렇게 코드를 바꾸고 실행해보면 출력되는 값이 3이 아니라 5로 바뀐다. global. 이라고 명확하게 범위를 지정해줬기 때문에, 더 좁은 범위의 n이 아닌 글로벌 범위의 n을 출력하게 된 것이다.

 

 또 여기서 알 수 있듯이, globalvar 로 선언할 경우에는 앞에 global.을 붙이든 안 붙이든 상관 없이 global 범위의 변수로 인식된다는 것이다.(단, 반대로 처음부터 globalvar를 사용하지 않고 global. 을 붙여 선언했을 경우에는 항상 global.을 붙여야지만 제대로 인식이 된다.)

 

 이론적인 부분을 설명하기 위해 이 현상을 설명했지만, 사실 가장 좋은 것은 애초부터 이름이 겹치지 않게 변수를 선언하는 것이다.

 

 

5. 변수의 타입

 

처음 변수의 정의를 설명할 때, 변수는 단순한 수만을 가리키는 것이 아니라 게임 내에서 이용하는 모든 종류의 자료, 심지어 오브젝트나 인스턴스까지 포함하는 개념이라는 이야기를 했었다. 이 때 이 '오브젝트', '인스턴스', '숫자', '문자' 이런 것들을 일종의 타입이라고 이야기한다. 위에서 언급한 것들은 서로 호환되기 힘들며 각기 독특한 특징을 가지고 있다.

 

 그런데 사실 GML에는 변수의 타입이라는 개념이 존재하지 않는다. 하나의 변수에 숫자건 오브젝트건 인스턴스건 아무 것이나 대입이 가능한 것이 GML의 특징이다. 

 

 이런 타입의 개념이 없는 특징 때문에 생기는 특징들도 많이 존재하지만, 게임 내의 다른 요소들과 연관되는 경우가 많기 때문에 문법을 배워보고자하는 지금 다룰 만한 내용은 아닌 듯하다. 지금은 GML에는 변수의 타입이라는 개념이 없으며, 변수에 대입하고 싶은 값을 아무 것이나 대입 가능하다는 것만 알아두도록 하자.



Profile
2
Lv

0개의 댓글

번호 제목 글쓴이 날짜 조회 수
공지 게임메이커 구체적인 설명과 알면 매우 좋은 팁 30개 [장문] 7 profile 도개걸윷모 2018.11.03 186
64 [팁] <댓글 스티커>, <쿠키 마켓>의 쿠키 반환 비율 (수수료, 이익 비율) 2 profile 며르치 2019.01.21 33
63 [팁] 쿠키 얻기/쓰기 조건 정리 4 profile 며르치 2019.01.17 60
62 [쿠키 API] ini처럼 온라인 데이터 저장/불러오기 구현하기 3 profile 주인장수표 2018.12.26 65
61 [쿠키 API] 구글, 네이버, 카카오톡 로그인 구현하기 profile 주인장수표 2018.12.26 52
60 인벤토리 만들기 - 1 profile Experience 2018.12.18 36
59 간단한 도트 찍는 방법! profile Experience 2018.12.17 23
58 [자료] 스팀 게임 플레이어의 통상적 컴퓨터 사양 1 profile 주인장수표 2018.12.17 21
57 [변수의 활용] VAR (if) 액션과 컨트롤액션 profile Experience 2018.12.17 6
56 윈도우를 컨트롤하자! profile Experience 2018.12.17 16
55 GML 차근차근 배워보기. [ 4 ] 조건문 profile Experience 2018.12.17 7
54 GML 차근차근 배워보기. [ 3 ] 연산자 (2) profile Experience 2018.12.17 5
53 GML 차근차근 배워보기. [ 3 ] 연산자 (1) profile Experience 2018.12.17 10
GML 차근차근 배워보기. [ 2 ] 변수 (2) profile Experience 2018.12.17 8
51 GML 차근차근 배워보기. [ 2 ] 변수 (1) profile Experience 2018.12.17 11
50 GML 차근차근 배워보기. [ 1 ] 강좌 진행 환경 조성 2 profile Experience 2018.12.17 8
49 리얼리티 '뷰' 노이즈 강좌 profile Experience 2018.11.29 14
48 [윈도우] 게임을 실행할 때 다른 윈도우를 모두 최소화시키기 profile Experience 2018.11.29 13
47 간단한 8방향 이동 코드 profile Experience 2018.11.29 9
46 겜스 간단한 페이드인/페이드아웃 profile Experience 2018.11.29 11
45 게임메이커 8 강좌 5화 -룸- END profile Experience 2018.11.29 13
서버에 요청 중입니다. 잠시만 기다려 주십시오...