안녕하세요.
애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.
오늘도 함수에 대한 이야기를 계속하겠습니다.
오늘 내용은 제가 함수를 사용하는 방식에 대해서 이야기를 하겠습니다.
이 방식은 그냥 제가 편해서 사용하는 방식이기 때문에 '꼭 이렇게 해야 한다.'는 것이 아닌 '이렇게 쓰는 사람도 있구나!' 하고 너그럽게 봐주셨으면 좋겠습니다. ㅎㅎ
함수는 인자를 여러 개를 쓸 수 있다고 이야기를 이전에 했었는 사실 인자가 없어도 가능한 함수도 있습니다.
아래와 같이 해봅시다.
1
2
3
4
5
6
|
fn non_fn = format "함수 입니다.\n"
non_fn ()
non_fn ()
non_fn ()
non_fn ()
|
cs |
뭔가 간단해 보이네요.
내용을 짚기 전에 1번 라인을 확인해 봅시다.
fn을 썼으니 함수가 맞기는 하는데 형식이 약간 다르네요.
괄호가 빠져 있습니다.
if문이라든가 for문 등을 보면 항상 괄호가 따라와 해당 문의 실행 내용을 기술할 수 있게 했습니다.
그런데 기술할 내용인 한 문장이라면 굳이 괄호를 사용하는 것이 줄 수도 길어지고 번잡스러워집니다.
그렇게 기술할 내용이 1문 장인 경우 괄호를 생략하고 1줄로 표현할 수 있습니다.
위의 함수도 사실은
fn non_fn =
(
format "함수 입니다.\n"
)
인데 한 줄로 줄인 것입니다.
잡설이지만 중요한 잡설이라 짚었습니다.
그럼 계속해서 내용을 확인해 보겠습니다.
별거 없네요.
그냥 함수를 사용해서 format문을 4번 불렀습니다. 단지 함수를 호출할 때 뒤에 괄호가 붙어 있을 뿐입니다.
그냥 함수 사용 없이 for문으로 4번 돌려도 되지만, 함수의 특징을 설명하는 것이니 각각의 함수를 호출하는 중간에 100 문장 정도 되는 스크립트가 있다고 상상해 주세요,. ㅎㅎㅎ
기존의 함수에는 항상 인수(prarmeter)가 붙어 있었는데 대신 괄호가 붙어 있습니다.
이런 함수가 인수가 없는 함수를 호출하는 방식입니다.
'설명 끝~~~'이면 좋겠지만, 다음 단계로 넘어가겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
rollout Dice_Roll "Test!"
(
fn DoA_fn num =
(
format "radNum = %\n" radNum
if(num == 6) do return true
return false
)
button test_btn "주사위"
on test_btn pressed do
(
radNum = random 1 6
fnResult = DoA_fn radNum
if(fnResult == true) then format "성공!!\n"
else format "실패\n"
)
)
createdialog Dice_Roll
|
cs |
이전에 예제로 했던 주사위 결과 값을 조금 수정했습니다.
함수 DoA_fn안에 format문으로 radNum값을 출력하게 했습니다.
실행해서 버튼을 클릭하면
radNum = undefined
라고 출력됩니다.
즉 radNum이 정의되지 않았다는 얘기입니다.
'on test_btn pressed do'의 내용에 'radNum = random 1 6'이라고 정의했는데 정의가 안 됐다고 합니다.
이상해 보이시는 분은 기초의 '변수의 범위'를 읽고 오시기 바랍니다.
만약 radNum에 값이 들어가서 결과 값이 숫자로 출력되신다면 맥스를 껐다가 다시 킨 다음에 실행해 주시기 바랍니다.
이 스크립트 이전에 radNum라는 변수를 사용하여 맥스가 컴퓨터 메모리에 radNum을 기억시켰다면 그것을 가져다 쓰기 때문입니다.
기본적으로 변수는 자신이 정의된 영역(괄호) 밖으로 값을 전달하지 못합니다.
즉 상위 영역에서 정의된 변수는 하위 영역에서도 사용할 수 있지만 그 반대는 불가능한 것입니다.
하위 영역에서 정의된 변수가 상위 영역에서도 사용되려면 변수명 앞에 global을 붙이는 방법이 있기는 하지만 radNum은 그렇지 않습니다.
그렇다면 만약 radNum을 최상위에서 정의를 하고 시작한다면 그 하위인 모든 곳에서 사용할 수 있을 것입니다.
위 예제를 다음과 같이 변경하고 실행해 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
radNum = 0
fnResult = false
rollout Dice_Roll "Test!"
(
fn DoA_fn =
(
format "radNum = %\n" radNum
if(radNum == 6) do fnResult = true
)
button test_btn "주사위"
on test_btn pressed do
(
radNum = random 1 6
DoA_fn()
if(fnResult == true) then format "성공!!\n"
else format "실패\n"
)
)
createdialog Dice_Roll
|
cs |
최상위 영역에 변수 둘을 설정했고 하위 영역에서 그 변수를 가져다 사용합니다.
그렇기 때문에 함수를 사용할 때 따로 인자(parameter)가 필요가 없게 됩니다.
그리고 함수를 실행 후 받을 리턴 값도 함수 실행 중에 최상위 변수에 저장되기 때문에 필요 없게 됩니다.
이 방법을 사용하면 인자를 관리하는 일이 줄어드는 반면에 기억해야 하는 변수가 늘어납니다.
프로그램적으로 깊게 파고들면 메모리도 더 차지하고 실행 속도도 느려지고 어쩌고 저쩌고 많은 부정적인 내용을 포함합니다.(저도 정확히는 잘 몰라요.)
하지만 맥스 스크립트가 빠른 속도와 메모리 관리가 필요할 정도의 큰 작업을 할 이유가 없기 때문에 이런 방식을 사용한다 해도 큰 문제는 없을 것이라 생각합니다.
우리가 하고 싶은 것은 귀찮은 반복 작업은 컴퓨터에게 시키고 그 시간에 느긋하게 담배 한 대 빨고 오는 것이니까요.
제 변명(?)때문에 이야기가 길어졌습니다. ㅎㅎ
함수에 대한 이야기는 여기까지 하기로 하고 다음에는 '기본과정'의 progressBar UI에 대해서 이야기하겠습니다.
'맥스스크립트 기초' 카테고리의 다른 글
문자열(String) 함수(2) (0) | 2019.09.01 |
---|---|
문자열(String) 함수(1) (0) | 2019.08.31 |
맥스 스크립트의 유형(2), 사용자 스크립트 위치 (0) | 2019.08.20 |
맥스 스크립트의 유형(1) (0) | 2019.08.19 |
함수(2) (0) | 2019.08.12 |
함수(1) (3) | 2019.08.11 |
Color Values (0) | 2019.08.02 |
오브젝트의 옵션 (0) | 2019.07.18 |