⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
30. 조건문 (중)
마지막 수정일: 2023-12-22
이번에는 조건문의 추가적인 용법을 설명드리겠습니다.
else if
여러 조건에 따라 동작이 나뉘는 프로그램을 작성하려면 어떡해야할까요? 아래와 같은 예시를 생각해봅시다.
- 변수의 값이 2의 배수이면 "2의 배수입니다."를 출력
- 변수의 값이 3의 배수이면 "3의 배수입니다."를 출력
- 모두 아니면 "어느 쪽도 아닙니다"를 출력
가장 간단한 방법은 이번에 배울 else if
를 사용하는 것입니다.
이것은 여러 조건에 따라 각각 다른 분기를 시킬 때 사용됩니다.
전체 구성은 아래와 같습니다.
1 if (조건1)
2 {
3 //조건 1을 만족하면 할 행동
4 }
5 else if (조건2)
6 {
7 //조건 1이 거짓일 때, 조건 2를 만족하면 할 행동
8 }
9 else
10 {
11 //모든 조건을 만족하지 못할 때 할 행동
12 }
이로써 우리는 각각의 조건마다 다른 행동을 할 수 있도록 조건문을 구성할 수 있습니다.
else if
문은 필요한 만큼 사용할 수 있고, else
와 그 블록은 필요하지 않으면 삭제해도 됩니다.
else if의 필요성
"그냥
if
를 여러 개 쓰면 안되나요?"
이런 의문이 들 수 있습니다.
if
를 연달아서 쓰면 else if
없이도 여러 조건에 따른 행동을 분기할 수 있지 않을까요?
그러나 이 경우 아래와 같은 문제가 생깁니다.
1. 블록 안쪽에서, 다음 조건문의 조건의 결과가 바뀔 수 있습니다.
예를 들어서 var
값으로 분기가 나뉘는 경우, 첫 번째 조건문의 블록에서 var
값이 바뀔 수 있습니다.
이 상태에서 두 번째 조건문의 조건으로 var
값을 이용한다면 의도치 않은 동작을 유발할 수 있습니다.
첫 번째 조건문의 블록에서 그 값이 바뀌었기 때문이죠.
그러나 else if
를 사용하고 어떤 조건문이 참이라 그 블록의 내용을 수행했을 경우,
그 밑에 존재하는 else if
와 else
를 사용한 조건문은 아예 건너뜁니다.
따라서 한 조건문 블록을 실행하면 그 밑의 else if
를 수행하지 않습니다.
1 if (true)
2 {
3 //var가 참(true)이기 때문에 항상 이 구문을 실행
4 }
5 else if (true)
6 {
7 //앞선 조건문이 참이었기 때문에, 이 블록을 수행하는 조건은 아예 검사하지 않음
8 //따라서 이 블록은 조건이 참임에도 불구하고 수행되지 않습니다.
9 }
10 else
11 {
12 //앞선 조건문 중이 참인 조건문이 있었기 때문에, else 블록은 수행되지 않음
13 }
2. else의 사용이 곤란해집니다.
아래처럼, 여러 if
를 사용하면 가장 마지막의 if
만 else
에 대응됩니다.
1 if (조건1)
2 {
3 //조건 1을 만족하면 할 행동
4 }
5 if (조건2)
6 {
7 //조건 2를 만족하면 할 행동
8 }
9 else
10 {
11 //조건 2가 만족되지 않았을 때 할 행동
12 }
이와 같은 경우 else
블록은 첫 번째 조건을 만족하지 않는다 해도 실행되지 않죠.
어떤 식으로든 첫 번째 if
와는 별개의 구문이 되어버리는 것입니다.
물론 여러 if
를 연달아 써야하는 경우도 있습니다.
그 두 조건이 어떠한 방식으로든 연관이 없다면 그렇게 합니다.
연관이 없는 두 조건문을 else if
로 묶는 것은 오히려 잘못된 것입니다.
따라서 else if
의 사용을 완전히 이해하는 것이 중요합니다.
실습
1. else if의 기초적인 사용
아래 예제는 var
변수의 값에 따라 다른 알림 상자를 출력합니다.
1 var := 3
2 if (var > 0)
3 {
4 MsgBox("양수입니다.")
5 }
6 else if (var < 0)
7 {
8 MsgBox("음수입니다.")
9 }
10 else
11 {
12 MsgBox("0 입니다.")
13 }
var
변수의 값에 따라 조건이 분기됩니다.
직접 값을 변경시키며 스크립트를 실행시켜보세요.
var
값이 양수면 양수입니다.를, 음수면 음수입니다.를 출력합니다. 어느 쪽도 아니면 0이라고 출력하죠.
2. 반복문과 결합된 조건문 - 배수 판별 프로그램
실습을 통해 처음 말씀드린 배수 판별 예시을 심화적으로 만들어보며 반복문과 조건문을 모두 연습해보겠습니다.
이 프로그램은 아래와 같이 구성할 것입니다.
- 1부터 10까지 값을 증가시키면서 그 값이 배수인지를 판별
- 변수의 값이 2의 배수이면 그 값과 "2의 배수입니다."를 출력
- 변수의 값이 3의 배수이면 그 값과 "3의 배수입니다."를 출력
- 모두 아니면 그 값과 "어느 쪽도 아닙니다"를 출력
어떤 수를 2로 나눈 나머지가 0이면, 그 수는 2의 배수임을 알 수 있습니다. 3의 배수도 마찬가지고요. 이 배수의 특성을 이용하여 프로그램을 작성하면 됩니다.
나머지를 구하는 함수는 Mod
인데, 원형은 아래와 같습니다.
Mod(Dividend, Divisor)
이 함수는 두 수를 나눴을 때의 나머지를 반환합니다.
따라서 Mod(3, 2)
는 1을 반환하죠. '3 나누기 2'의 나머지는 1이니까요.
이 함수를 이용하여 원하는 프로그램을 만들어보겠습니다.
1 Loop 10
2 {
3 if (Mod(A_Index, 2) = 0)
4 {
5 MsgBox(A_Index ": 2의 배수입니다.")
6 }
7 else if (Mod(A_Index, 3) = 0)
8 {
9 MsgBox(A_Index ": 3의 배수입니다.")
10 }
11 else
12 {
13 MsgBox(A_Index ": 어느 쪽도 아닙니다.")
14 }
15 }
위 예제는은 var
변수의 값이 2의 배수일 때와 3의 배수일 때 각각 다른 알림 상자를 나타내는 예시입니다.
실행해보니 어떤가요? 멋지게 2의 배수와 3의 배수를 구별하여 출력합니다.
else
와 그 블록을 없애면 어느 쪽도 아닙니다.라는 알림은 나타나지 않습니다.
예제를 수정하여 2의 배수일 때와 3의 배수일 때만 알림 상자를 출력하도록 해봅시다.
자율적으로 연습해보세요.