프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

30. 조건문 (중)


이번에는 조건문의 추가적인 용법을 설명드리겠습니다.

else if

여러 조건에 따라 동작이 나뉘는 프로그램을 작성하려면 어떡해야할까요? 아래와 같은 예시를 생각해봅시다.

  • 변수의 값이 2의 배수이면 "2의 배수입니다."를 출력
  • 변수의 값이 3의 배수이면 "3의 배수입니다."를 출력
  • 모두 아니면 "어느 쪽도 아닙니다"를 출력

가장 간단한 방법은 이번에 배울 else if를 사용하는 것입니다. 이것은 여러 조건에 따라 각각 다른 분기를 시킬 때 사용됩니다.

전체 구성은 아래와 같습니다.

1if (조건1)
2{
3 //조건 1을 만족하면 할 행동
4}
5else if (조건2)
6{
7 //조건 1이 거짓일 때, 조건 2를 만족하면 할 행동
8}
9else
10{
11 //모든 조건을 만족하지 못할 때 할 행동
12}
else if 문의 사용

이로써 우리는 각각의 조건마다 다른 행동을 할 수 있도록 조건문을 구성할 수 있습니다. else if 문은 필요한 만큼 사용할 수 있고, else와 그 블록은 필요하지 않으면 삭제해도 됩니다.

else if의 필요성

"그냥 if를 여러 개 쓰면 안되나요?"

이런 의문이 들 수 있습니다. if를 연달아서 쓰면 else if 없이도 여러 조건에 따른 행동을 분기할 수 있지 않을까요?

그러나 이 경우 아래와 같은 문제가 생깁니다.

1. 블록 안쪽에서, 다음 조건문의 조건의 결과가 바뀔 수 있습니다.

예를 들어서 var 값으로 분기가 나뉘는 경우, 첫 번째 조건문의 블록에서 var 값이 바뀔 수 있습니다.

이 상태에서 두 번째 조건문의 조건으로 var 값을 이용한다면 의도치 않은 동작을 유발할 수 있습니다. 첫 번째 조건문의 블록에서 그 값이 바뀌었기 때문이죠.

그러나 else if를 사용하고 어떤 조건문이 참이라 그 블록의 내용을 수행했을 경우, 그 밑에 존재하는 else ifelse를 사용한 조건문은 아예 건너뜁니다. 따라서 한 조건문 블록을 실행하면 그 밑의 else if를 수행하지 않습니다.

1if (true)
2{
3 //var가 참(true)이기 때문에 항상 이 구문을 실행
4}
5else if (true)
6{
7 //앞선 조건문이 참이었기 때문에, 이 블록을 수행하는 조건은 아예 검사하지 않음
8 //따라서 이 블록은 조건이 참임에도 불구하고 수행되지 않습니다.
9}
10else
11{
12 //앞선 조건문 중이 참인 조건문이 있었기 때문에, else 블록은 수행되지 않음
13}
else 혹은 else if로 묶여있다면, 앞선 조건문 중 참인 것이 있을 경우 그 밑의 조건 검사는 건너뜁니다.

2. else의 사용이 곤란해집니다.

아래처럼, 여러 if를 사용하면 가장 마지막의 ifelse에 대응됩니다.

1if (조건1)
2{
3 //조건 1을 만족하면 할 행동
4}
5if (조건2)
6{
7 //조건 2를 만족하면 할 행동
8}
9else
10{
11 //조건 2가 만족되지 않았을 때 할 행동
12}
else는 조건 2를 만족하지 않았을 때에만 수행됩니다.

이와 같은 경우 else 블록은 첫 번째 조건을 만족하지 않는다 해도 실행되지 않죠. 어떤 식으로든 첫 번째 if와는 별개의 구문이 되어버리는 것입니다.

물론 여러 if를 연달아 써야하는 경우도 있습니다. 그 두 조건이 어떠한 방식으로든 연관이 없다면 그렇게 합니다. 연관이 없는 두 조건문을 else if로 묶는 것은 오히려 잘못된 것입니다.

따라서 else if의 사용을 완전히 이해하는 것이 중요합니다.

실습

1. else if의 기초적인 사용

아래 예제는 var 변수의 값에 따라 다른 알림 상자를 출력합니다.

1var := 3
2if (var > 0)
3{
4 MsgBox("양수입니다.")
5}
6else if (var < 0)
7{
8 MsgBox("음수입니다.")
9}
10else
11{
12 MsgBox("0 입니다.")
13}
예제 1. else if의 사용

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이니까요. 이 함수를 이용하여 원하는 프로그램을 만들어보겠습니다.

1Loop 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}
예제 2. 반복문과 결합하여 배수 판별

위 예제는은 var 변수의 값이 2의 배수일 때와 3의 배수일 때 각각 다른 알림 상자를 나타내는 예시입니다.

실행해보니 어떤가요? 멋지게 2의 배수와 3의 배수를 구별하여 출력합니다.

else와 그 블록을 없애면 어느 쪽도 아닙니다.라는 알림은 나타나지 않습니다. 예제를 수정하여 2의 배수일 때와 3의 배수일 때만 알림 상자를 출력하도록 해봅시다. 자율적으로 연습해보세요.

질문하러 가기