프날 오토핫키 강좌  v2

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

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

29. 조건문 (상)


지난 강좌의 에이다 러브레이스 이야기 기억하시나요?

최초의 프로그래머인 그녀가 발명한 것 중 현대 프로그램의 흐름 방식에 큰 영향을 끼친 두 가지는 반복, 조건이라고 했습니다. (그 외에 서브루틴 등의 개념도 그녀가 만들었는데, 강좌에서 다루지 않는 내용이므로 반복과 조건만 뽑았습니다.)

반복문을 배웠으니 이제 조건문을 배울 차례입니다.

조건문 개요

조건문이란, 특정 조건을 만족했을 때만 명령을 실행하도록 해주는 구문을 의미합니다. 예를 들어 오후 3시가 되면 알람이 울리게 할 수도, 사용자가 키를 누르면 반복을 탈출하게 할 수도 있습니다. 공통적으로 "만약 ~면 ~해라" 꼴이죠.

가장 기초적인 조건문은 if를 사용하는데, 아래와 같이 그 옆에 괄호를 써준 후 조건을 적어줍니다. 그리고 조건을 만족할 때 실행할 블록을 표시해주면 됩니다.

1if (조건)
2{
3 //조건을 만족할 때 할 일
4}
if의 기본 형태

'조건을 만족한다'는 것은 조건이 '참(true)'일 경우를 이야기합니다. '참'은 무엇일까요?

참과 거짓

잠시 15강의 비교 연산자 파트로 돌아가봅시다. 비교 연산자의 결과값은 1 아니면 0이라고 말씀드렸었습니다. 비교의 결과가 참이면 1, 거짓이면 0을 뱉는다고 했습니다. 그래서 아래와 같은 코드는 모두 1을 출력합니다.

1MsgBox(1 < 2)
2MsgBox(1 = 1)
3MsgBox(1 != 2)
모두 옳은 비교수식이기 때문에 1을 출력합니다.

그리고, 아래와 같은 코드는 모두 0을 출력하겠죠.

1MsgBox(1 > 2)
2MsgBox(1 != 1)
3MsgBox(1 = 2)
모두 거짓된 비교수식이기 때문에 0을 출력합니다.

위 사실로 미루어보아, 오토핫키에서 '참'은 곧 1, '거짓'은 곧 0으로 취급됨을 알 수 있습니다. 또한, 1과 0을 포함하여 참과 거짓으로 판단되는 값을 정리해보면 아래와 같습니다.

'참'으로 판단되는 경우'거짓'으로 판단되는 경우
  • 1
  • 빈 값과 0을 제외한 모든 존재하는 값
  • 0
  • 빈 값

예를 들어서 "Hello"라는 문자열은 0도 빈 값도 아니기 때문에 참입니다.

Tip: true와 false

내장 변수를 소개할 때 truefalse라는 내장 변수를 언급한 적 있습니다. 각각 숫자 1, 0이 담겨있습니다. 이를 이용하면 코드를 조금 더 읽기 쉽게 만들 수 있습니다.

if

조건문은 if 코드로 사용합니다. 가장 기본 형태를 다시 적어보겠습니다.

1if (조건)
2{
3 //조건을 만족할 때 할 일
4}
if의 기본 형태

조건이 참이면 블록 안의 내용을 실행하게 됩니다. 이것이 조건문의 가장 기초적인 사용 방법입니다.

else

if 블록 밑에 연달아서 else 블록을 넣어 '조건을 만족하지 않을 때'의 동작을 작성해줄 수 있습니다.

1if (조건)
2{
3 //조건을 만족할 때 할 일
4}
5else
6{
7 //조건을 만족하지 않을 때 할 일
8}
else의 기본 형태

else는 조건을 만족하지 않을 때를 의미하므로, 반드시 조건을 가진 if 문이 선행되어야 합니다.

실습

처음 보는 구문이라 낯설 순 있어도, 그렇게 어렵지는 않습니다. 실습해보며 익혀나가면 금방 원하는 조건문을 작성할 수 있을 것입니다.

1. 가장 기초적인 조건문

1var := 2
2if (var = 1)
3{
4 MsgBox("var의 값은 1입니다.")
5}
6else
7{
8 MsgBox("var의 값은 1이 아닙니다.")
9}
예제 1. 조건문을 사용한 모습

var 변수에 따라 다른 알림 상자가 출력되는 예제입니다. 비교 연산자를 유의미하겐 처음 이용해보는 것 같은데, 어렵지 않죠?

2. 복잡한 조건을 가진 조건문

쉬운 예제 하나만 더 실습해보겠습니다.

1var := 1
2if (var > 2 || var = -1)
3{
4 MsgBox("var의 값은 2보다 크거나 -1입니다.")
5}
6else
7{
8 MsgBox("var의 값은 2보다 크지 않으면서, -1도 아닙니다.")
9}
예제 2. 다른 경우에서 else의 사용

코드를 실행해보지 않고도 결과를 짐작할 수 있겠죠? var 값이 1이기 때문에, if 블록이 아닌 else 블록으로 진행될 것입니다.

조건이 다소 까다롭습니다. var > 2 || var = -1라는 조건을 말로 풀어낼 수 있다면 크게 어렵진 않은데, 문제는 해당 조건을 만족하지 않을 때 수행되는 else 블록입니다. 수학에서 명제를 다루는 것과 같으나, 명제에 익숙하지 않다면 아래와 같이 쪼개서 계산하시면 됩니다.

  • var > 2가 아니더라도 var = -1이면 조건이 참이 된다.
  • var = -1가 아니더라도 var > 2이면 조건이 참이 된다.
  • 따라서, var > 2가 아니면서 var = -1도 아니어야 else 구문이 수행된다.

3. 반복문과 조건문의 결합 1

1Loop
2{
3 MsgBox("반복: " A_Index "회")
4 if (A_Index = 3)
5 {
6 break
7 }
8}
9MsgBox("반복문이 탈출되었습니다.")
예제 3. 현재 반복 횟수가 3이면 반복문을 탈출

위 예제는 반복을 하며 알림 상자를 보여주다가, 현재 반복 횟수(A_Index)가 3이 되면 break를 통해 반복문을 탈출하는 예제입니다.

Loop에 반복 횟수를 지정하지 않으면 무한 반복한다고 말씀드린 적 있습니다. 그러나 예제에선 반복 횟수를 지정해주지 않았음에도 불구하고, 조건문을 통해 현재 반복 횟수가 3일 때 반복을 탈출시켜주고 있죠.

4. 반복문과 조건문의 결합 2

또, 아래와 같이 continue를 사용하는 경우도 만들어볼 수 있습니다.

1Loop 10
2{
3 if (A_Index <= 5)
4 {
5 continue
6 }
7 MsgBox("반복: " A_Index "회")
8}
9MsgBox("반복문이 탈출되었습니다.")
예제 4. 반복 횟수가 5회 이하면 아무 동작도 하지 않음

continue를 만나면 해당 반복문의 남은 내용을 건너 뛰고 다음 반복으로 속행하기 때문에, 반복 횟수가 5회 이하인 경우 7번 줄의 알림 상자가 출력되지 않는 모습을 볼 수 있습니다.

분량상의 문제로 '조건문(중)' 강으로 이어 하겠습니다.

질문하러 가기