안녕하세요.
애니메이터가 들려주는 MAX Script의 스크립팅하는 애님입니다.
오늘은 제어문의 'if'문에 대해서 얘기해 보려고 합니다.
'if'문은 어떤 조건에 따라 어떠한 반응을 할지를 결정하는 제어문입니다.
스크립트 작업을 할 때 변수의 값이 다른 무엇과 비교해서 그 결과를 가지고 작업을 진행해야 하는 경우가 매우 많이 발생합니다.
예를 들어 변수 'a'라는 값이 '10'인데 '20'보다 작으면 '작다'라고 출력하고 싶습니다.
맥스 스크립트에서는 이런것을 다음과 같이 적습니다.
1
2
3
4
5
|
a = 10
if(a < 20) do
(
format "small\n"
)
|
cs |
3번과 5번의 괄호는'()'는 if문의 '지역'이 됩니다.
괄호 안에서 생성되는 변수는 'global'을 쓰지 않으면 'if'문 안에서만 쓰이는 지역변수가 됩니다.
그리고 괄호 안에 적혀 있는 내용은 'Tab'키를 눌러 들여 씁니다.
꼭 들여 쓰지 않아도 상관은 없는데, 코딩을 읽을 때 가독성이 좋아 지기 때문에 꼭 사용할 것을 권장합니다.


원하던 결과인 'small'이 나오네요.
이번에는 'a'가 '30'이고 같은 'if'문을 쓴다면 어떻게 될까요?
1
2
3
4
5
|
a = 30
if(a < 20) do
(
format "small\n"
)
|
cs |


'정의되지 않은'이란 뜻의 'undefined'라고 나왔네요.
당연히 'if'문에서 조건에 맞지 않아서 아무련 결과가 없을 줄 알았는데 'undefined'가 나왔네요.
ㅎㅎㅎ 이건 저도 몰랐습니다.
하지만 제가 원했던 'format문을 거치지 않는다.'는 맞았네요.(반은 맞았습니다.)
여기서 '20'보다 큰 경우도 어떤 결과를 냈으면 좋겠습니다.
문장으로 써서 '변수 a가 20보다 작으면 small, 반대로 크면 'big'라고 하자.'라고 하려면 어떻게 하면 좋을까요?
1
2
3
4
5
6
7
8
9
|
a = 30
if(a < 20) do
(
format "small\n"
)
if(a > 20) do
(
format "small\n"
)
|
cs |
이렇게 쓰면 되는 걸까요?
물론 이렇게 써도 생각했던 결과를 낼 수동 있습니다.
하지만 이것은 정확하게 말한 면 'a가 20보다 작으면 small이라고 적어라. a가 20보다 크면 big라고 적어라.'라는 두 개의 문장입니다.
이것은 연결된 문장이 아니라 2개로 떨어진 문장으로 문장 사이에 어떤 문장이 들어와도 되는 완전히 분리된 문장입니다.
우리가 원하는 조건은 하나로 연결된 'a가 20보다 작으면 small이라고 적고, 20보다 크면 big라고 적어라.'입니다.
다음과 같이 적는 것이 맞습니다.
1
2
3
4
5
6
7
8
9
|
a = 30
if(a < 20) then
(
format "small\n"
)
else if(a > 20) do
(
format "big\n"
)
|
cs |
자세히 보면 2번 줄의 if문 뒤의 'do'가 'then'으로 바뀌었습니다.
'if'문 뒤에 다른 조건문이 따라오지 않는다면 'do'를 사용하고, 다른 조건문이 따라온다면 'then'을 사용합니다.


제가 생각했던 결과 값이 나왔습니다.
그런데 뭔가 한 가지 빠진 것 같습니다.
만약 a가 '20'이라면 어떻게 될까요?
'big'이 될까요? 'small'이 될까요?
'20'은 '20'보다 크지도 작지도 않기 때문에 위의 조건문으로는 부족합니다.
부족한 것을 채우기 위해 다음과 같이 적어 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
a = 20
if(a < 20) then
(
format "small\n"
)
else if(a > 20) then
(
format "big\n"
)
else
(
format "same\n"
)
|
cs |
위 코딩을 자세히 봅시다.
아까 까지는 6번 라인의 'if'문의 'do'가 'then'으로 바뀌었습니다.
조건이 밑에 하나 더 붙어서 마지막 조건이 아니기 때문에 변경이 된 것입니다.
그런데 마지막 조건인 10번 라인을 확인하면 'else'만 있습니다.
오타는 아니고 'else'만 붙는 다면 '위 조건 중에 해당하는 것이 없으면'이라는 뜻이 됩니다.
그래서 조건의 내용이나 'do', 'then'이 붙지 않습니다.
생각했던 결과가 나왔습니다.
위와 같이 좌항과 우항이 큰가 작은가 같은가 같지 않은가 등의 연산자를 '관계 연산자'라고 합니다.
관계 연산자의 종류는 다음과 같습니다.
< | 좌항이 우항보다 작다. |
> | 좌항이 우항보다 크다. |
<= | 좌항이 우항보다 작거나 같다. |
>= | 좌항이 우항보다 크거나 같다. |
== | 좌항과 우항이 같다. |
!= | 좌항과 우항이 같지 않다. |
필요에 따라 사용하면 됩니다.
만약 다음과 같은 조건이라면 어떻게 써야 할까요?
a는 10보다 크고 b가 true일 때 good라고 출력하고 아니면 bad라고 출력해라.
한번 생각해 봅시다.
위에 배운 조건 'if'와 'else'로 할 수 있을까요?
할 수 있습니다.
두 가지 조건이 하나의 조건으로 묶여 있기 때문에 응용이 필요합니다.
우선은 다음과 같이 적어 봅시다.
1
2
3
4
5
6
7
8
9
10
|
a = 20
b = true
if(a > 10) then
(
format "good\n"
)
else
(
format "bal\n"
)
|
cs |
내용을 확인 하면 변수 'a', 'b'에 '20', 'true'를 각각 넣습니다.
그다음에 '만약 a가 10보다 크면 good라고 출력하고, 그렇지 않다면 bad를 출력하라'라고 적혀 있습니다.
'b'가 'true'일 경우가 빠졌네요.
다음과 같이 추가해 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
a = 20
b = true
if(a > 10) then
(
if(b == true) then
(
format "good\n"
)
else
(
format "bad\n"
)
)
else
(
format "bad\n"
)
|
cs |
'if(a > 10) then'아래 내용에 'if(b == true) then'가 생겼습니다.
이것은 'a'가 '10'보다 크다는 조건을 만족한 상태에서 'b'가 'true'라는 조건이 발생했기 때문에 두 조건을 모두 만족해야만 'good'이라는 문자가 출력됩니다.
즉 'a'가 '10'보다 크고 'b'가 'true'일 때 'good'을 출력하는 것이죠.
9번 라인은 'a'가 '10'보다 크지만 'b'가 'true'가 아닌 경우를 상정한 겁니다.
많이 복잡해 보이네요.
하지만 좀 더 간단하게 줄여 쓸 수 있습니다.
논리 연산자를 이용하면 두 개의 조건을 하나의 조건으로 만들 수 있습니다.
다음과 같이 적어 봅시다.
1
2
3
4
5
6
7
8
9
10
|
a = 20
b = true
if((a > 10)and(b == true)) then
(
format "good\n"
)
else
(
format "bad\n"
)
|
cs |
3번 라인이 뭔가 바뀌었네요.
'and'라는 것이 있는데요.
이것은 '좌항의 내용 만족하고 우항의 내용을 만족한다.'입니다.
양쪽항이 둘 다 참이어야 한다는 말입니다.
즉 'a는 10보다 크고 b는 true일 때' 라는 말이 됩니다.
많이 짧아 져서 보기도 좋네요. ㅎㅎ
오늘은 'if'문을 얘기했습니다.
꽤 길어졌는데 그만큼 자주 쓰고 중요한 내용이기 때문입니다.
다음엔 'if'문과 비슷한 'case'문을 얘기해 보겠습니다.
'맥스스크립트 기초' 카테고리의 다른 글
맥스스크립트의 알아두면 좋은 것 (0) | 2019.07.12 |
---|---|
반복문(while) (3) | 2019.07.10 |
반복문(for) (8) | 2019.07.09 |
제어문(case) (5) | 2019.07.07 |
배열 함수 (3) | 2019.07.05 |
배열 (6) | 2019.07.03 |
변수의 범위 (10) | 2019.07.02 |
변수의 연산 (0) | 2019.07.01 |