값과 참조
이 문서에서는 GameMaker에서 변수를 생성할 때 값이 저장되는 데이터 타입 및 값과 참조의 차이에 대해 설명합니다. 또한 다양한 활용 및 응용 예제를 포함하였습니다.
1. 데이터 타입
GameMaker에서 변수를 만들면, 그 변수가 저장하는 값은 여러 데이터 타입 중 하나일 수 있습니다. 예를 들어: - 숫자는 Real 값 - 문자열은 String - 값의 목록은 Array 등입니다.
각 데이터 타입에 따라 변수의 값이 복사되거나 참조되는 방식이 다릅니다.
1.1. 값에 의해 전달되는 데이터 타입
- Real
- Boolean
- int64 (부호 있는 64비트 정수)
- String
1.2. 참조에 의해 전달되는 데이터 타입
- Array
- Struct
- 하나의 Handle로 참조되는 모든 것 (예: 객체 인스턴스, 데이터 구조 등)
2. 값 복사
변수를 다른 변수에 할당할 때, 그 값은 일반적으로 메모리의 새로운 위치에 복사됩니다. 예를 들어:
a = 125;
b = a;
이 과정에서 Variable a는 값 125를 저장하며, 새로운 Variable b는 a의 값을 복사하여 메모리의 다른 위치에 저장합니다. 이로 인해 a와 b는 서로 독립적입니다.
예를 들어:
a = 1000;
show_debug_message(a); // 출력: 1000
show_debug_message(b); // 출력: 125
3. 참조 사용
변수가 참조 데이터 타입을 가지고 있을 때, 그 값이나 데이터는 복사되지 않고, 변수에 다른 변수를 할당하면 두 변수 모두 메모리의 같은 위치를 참조합니다. 예를 들어, 배열은 참조입니다:
c = [1, 2, 3, 4, 5];
d = c; // c와 d는 같은 배열을 참조
이후에 c나 d를 통해 배열의 요소를 수정할 수 있습니다:
c[0] = 5; // c의 0번째 요소를 5로 수정
d[1] = 4; // d의 1번째 요소를 4로 수정
show_debug_message(c); // 출력: [5, 4, 3, 4, 5]
show_debug_message(d); // 출력: [5, 4, 3, 4, 5]
이처럼 c와 d는 같은 배열을 가리키고 있기 때문에, 한 변수에서의 변경 사항이 다른 변수에도 반영됩니다.
4. 값 전파와 참조 전파
변수를 함수에 전달할 때도 위의 규칙이 적용됩니다. 다음 예제를 참조하세요:
function try_to_modify_value(_value, _new_value) {
_value = _new_value; // _value의 값을 변경
}
function try_to_modify_array(_array, _new_value) {
array_push(_array, _new_value); // 배열에 새로운 값을 추가
}
var _val_orig = 48593;
try_to_modify_value(_val_orig, 75); // 원본 값은 변경되지 않음
show_debug_message(_val_orig); // 출력: 48593
var _array_orig = [1, 2, 3];
try_to_modify_array(_array_orig, 100); // 원본 배열은 수정됨
show_debug_message(_array_orig); // 출력: [1, 2, 3, 100]
5. 주의사항
GameMaker에서는 "값 전달" 데이터 타입에 대한 참조를 생성할 수 없지만, ref_create 함수는 디버그 오버레이에서만 사용할 수 있는 참조를 생성합니다.
활용 예제
| 예제 번호 | 설명 | 코드 예시 |
|---|---|---|
| 1 | 값 복사 방식을 확인 | gml a = 5; b = a; show_debug_message(a); show_debug_message(b); |
| 2 | 참조 방식 활용 | gml c = [1, 2]; d = c; c[0] = 9; show_debug_message(d); |
| 3 | 함수 내 값 전달 | gml function test_val(v) { v = 10; } test_val(a); show_debug_message(a); |
| 4 | 함수 내 배열 참조 | gml function test_array(arr) { array_push(arr, 5); } test_array(c); show_debug_message(c); |
이 문서는 GameMaker에서 값과 참조의 개념을 이해하고 활용하는 데 도움을 줄 것입니다.