제어 흐름

지금까지 살펴본 프로그램은 언제나 파이썬에 의해 정확히 위에서 아래로 실행되는 문장으로 구성됐습니다. 만약 프로그램의 동작 흐름을 바꾸고 싶다면 어떻게 해야 할까요? 예를 들어, 현재 시각에 따라 'Good Morning'이나 'Good Evening'을 출력하는 것과 같이 프로그램에서 어떤 결정을 받아들여 다양한 상황에 따라 다른 작업을 수행하게 만들고 싶다면 어떨까요?

제어 흐름 문장을 이용하면 이 같은 일을 처리할 수 있습니다. 파이썬에는 if, for, while이라는 세 가지 제어 흐름 문장이 있습니다.

if

if 문은 조건(condition)을 검사하는 데 사용됩니다. 즉, 조건이 참이라면(if) 문장 블록(if 블록)을 실행하고, 그렇지 않다면(else) 다른 문장 블록(else 블록)을 실행합니다. else 절은 선택사항입니다.

예제(if.py):

number = 23
guess = int(input('Enter an integer : '))

if guess == number:
    # 이곳에서 새 블록을 시작
    print('Congratulations, you guessed it.')
    print('(but you do not win any prizes!)')
    # 이곳에서 새 블록을 종료
elif guess < number:
    # 또 다른 블록
    print('No, it is a little higher than that')
    # 블록 안에서 원하는 무엇이든 할 수 있습니다...
else:
    print('No, it is a little lower than that')
    # 여기에 도달했다면 분명 guessed > number일 것입니다

print('Done')
# if 문의 실행이 끝나면 이 마지막 문장이 항상 실행됩니다

출력 결과:

$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done

$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done

$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done

동작 원리

이 프로그램에서는 사용자가 추측한 숫자를 받아 프로그램에서 미리 지정해둔 숫자가 맞는지 확인합니다. 예제에서는 number 변수를 23과 같은 정숫값으로 지정합니다. 그런 다음, input() 함수를 이용해 사용자가 추측한 숫자를 받습니다. 함수(function)는 재사용 가능한 프로그램 조각입니다. 함수에 대해서는 다음 장에서 자세히 알아보겠습니다.

예제에서는 파이썬에 내장된 input 함수에 문자열을 전달하는데, input 함수는 이 문자열을 화면에 출력하고 사용자가 뭔가를 입력하기를 기다립니다. 사용자가 뭔가를 입력하고 엔터 키를 누르면 input() 함수가 사용자가 입력한 내용을 문자열로 반환합니다. 그럼 이 문자열을 int를 이용해 정수로 변환한 후 guess 변수에 저장합니다. 사실, int는 클래스지만 지금 당장은 int로 문자열을 정수로 변환할 수 있다고만 알고 계시면 됩니다(사용자가 입력한 텍스트 문자열에 정수 숫자가 담겨 있다는 가정하에).

다음으로 사용자가 추측한 숫자와 앞에서 미리 선택해둔 숫자를 비교합니다. 두 숫자가 같으면 추측에 성공했다는 메시지를 출력합니다. 여기서는 어느 문장이 어느 블록에 속하는지 파이썬에게 알려주기 위해 들여쓰기를 사용한다는 데 주의합니다. 파이썬에서 들여쓰기가 아주 중요한 이유가 바로 여기에 있습니다. "일관된 들여쓰기" 규칙을 꼭 지켜주시길 바랍니다.

if 문 끝에 콜론(:)을 어떻게 넣었는지 눈여겨봅시다. 이를 통해 파이썬에게 문장 블록이 뒤이어서 등장한다는 사실을 알려줍니다.

그러고 나서 추측한 숫자가 실제 숫자보다 작은지 확인해서 만약 그렇다면 사용자에게 조금 더 높은 숫자를 입력해야 한다고 알립니다. 여기서 elif 절을 사용했는데, elif 절은 실제로 두 개의 연관된 if else-if else 문을 하나의 if-elif-else 문으로 합친 것입니다. 이렇게 하면 프로그램을 작성하기가 더 쉬워지고 들여쓰기의 양을 줄일 수 있습니다.

elifelse 문에도 반드시 끝에 콜론을 넣고 그 뒤에 각각에 해당하는 문장 블록이 와야 합니다(물론 들여쓰기도 적절히 해야 합니다).

if 문의 if 블록 안에 또 다른 if 문을 둘 수 있습니다. 이를 중첩 if 문이라 합니다.

elifelse 부분은 선택사항이라는 점을 기억하세요. if 문의 가장 기본적인 형태는 다음과 같습니다.

if True:
    print('Yes, it is true')

if 문과 elif, else 절의 실행을 모두 마치고 나면 if 문이 담긴 블록 다음에 있는 문장으로 넘어갑니다. 예제에서는 메인 블록(main block, 프로그램 실행이 시작되는)에 해당하며, 다음으로 실행할 문장은 print('Done') 문이 됩니다. 이 문장마저 실행하고 나면 파이썬은 프로그램이 끝났다는 것을 확인하고 프로그램의 실행을 마칩니다.

아주 간단한 프로그램인데도 알아야 할 사항들이 많았습니다. 이 모든 것들은 꽤나 직관적입니다(C/C++를 사용해본 분들에게는 놀랄 만큼 단순할 겁니다). 초장부터 이 모든 것들을 알아야 한다는 부담은 있겠지만 몇 번 연습하다 보면 금방 익숙해지고 자연스럽게 느껴질 것입니다.

C/C++ 프로그래머를 위한 메모

파이썬에는 switch 문이 없습니다. if..elif..else 문을 이용해 switch 문과 똑같이 할 수 있습니다(그리고 어떤 경우에는 딕셔너리를 이용해 더 빠르게 처리할 수 있습니다).

while 문

while 문을 이용하면 조건이 참일 동안 반복해서 문장 블록을 실행할 수 있습니다. while 문은 반복문(loop)의 일종입니다. while 문에는 선택적으로 else 절을 둘 수 있습니다.

예제(while.py):

number = 23
running = True

while running:
    guess = int(input('Enter an integer : '))

    if guess == number:
        print('Congratulations, you guessed it.')
        # 다음 코드는 while 문을 중단하게 합니다
        running = False
    elif guess < number:
        print('No, it is a little higher than that.')
    else:
        print('No, it is a little lower than that.')
else:
    print('The while loop is over.')
    # 이곳에서 하고 싶은 작업을 합니다

print('Done')

출력 결과:

$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done

동작 원리

이 프로그램에서도 숫자 맞추기 게임을 하지만 이번에는 사용자가 맞출 때까지 계속 숫자를 입력할 수 있습니다. 즉, 이전 절에서처럼 숫자를 추측하기 위해 매번 프로그램을 실행할 필요가 없습니다. 이 프로그램은 while 문의 쓰임새를 잘 보여줍니다.

이번에는 inputif 문을 while 문 안으로 옮기고 while 문 앞에서 running 변수를 True로 지정합니다. 먼저 running 변수를 검사해서 True이면 while 블록을 실행합니다. 이 블록이 실행되고 나면 조건을 다시 검사하며, 이 경우 조건은 running 변수입니다. running 변수의 값이 참이면 while 블록을 다시 실행하고, 그렇지 않으면 선택적인 else 블록을 실행한 후 다음 문장으로 넘어갑니다.

else 블록은 while 문의 조건이 False가 되면 실행됩니다. 조건을 처음으로 검사한 경우에도 else 블록이 실행될 수 있습니다. while 문에 있는 else 절은 break 문을 통해 반복문에서 빠져나가지 않는 이상 언제나 실행됩니다.

TrueFalse는 불리언(Boolean) 타입이라고 하며, 각각 10에 상응하는 것으로 간주됩니다.

C/C++ 프로그래머를 위한 메모

while 문에 else 절을 둘 수 있다는 점을 기억하세요.

for

for..in 문은 객체의 시퀀스(sequence)를 순회(iterate)하는, 즉 순서대로 각 항목을 통과하는 또 다른 반복문입니다. 시퀀스에 대해서는 이후 장에서 자세히 살펴보겠습니다. 지금 당장은 시퀀스가 여러 항목을 순서대로 묶은 것이라고 알고 계시면 됩니다.

예제(for.py):

for i in range(1, 5):
    print(i)
else:
    print('The for loop is over')

출력 결과:

$ python for.py
1
2
3
4
The for loop is over

동작 원리

이 프로그램에서는 숫자 시퀀스를 출력합니다. 이때 파이썬에 내장된 range 함수를 이용해 숫자 시퀀스를 생성합니다.

range 함수에 숫자를 두 개 전달하면 range 함수는 첫 번째 숫자에서 시작해 두 번째 숫자까지를 범위로 하는 숫자 시퀀스를 돌려줍니다. 예를 들어, range(1,5)[1, 2, 3, 4] 시퀀스를 돌려줍니다. 기본적으로 range에서는 1씩 숫자가 올라갑니다. range에 세 번째 숫자를 지정하면 그 값만큼 숫자가 올라갑니다. 예를 들어, range(1,5,2)[1,3]을 돌려줍니다. 참고로 숫자 범위는 두 번째 숫자 전까지, 즉 두 번째 숫자는 포함되지 않는다는 점을 기억하세요.

range()는 한 번에 숫자 하나만 생성하므로 만약 전체 숫자 리스트가 필요하다면 range()를 대상으로 list()를 호출하면 됩니다. 예를 들어, list(range(5))[0, 1, 2, 3, 4]를 반환합니다. 리스트에 대해서는 자료구조 장에서 설명하겠습니다.

이어서 for 문은 이 범위를 순회합니다. 예제의 for i in range(1,5)for i in [1, 2, 3, 4]에 상응하며, 이것은 마치 시퀀스 안의 각 숫자(또는 객체)를 한 번에 하나씩 i에 할당한 다음, 각 i 값에 대해 문장 블록을 실행하는 것과 같습니다. 예제에서는 문장 블록에서 i의 값을 출력하기만 합니다. else 부분은 선택사항입니다. 이 부분을 포함하면 break 문을 만나지 않는 이상 for 문이 끝나고 나서 언제나 한 번 실행됩니다.

참고로 for..in 문은 어떤 시퀀스에 대해서도 동작합니다. 여기서는 파이썬에 내장된 range 함수를 통해 생성된 숫자 리스트를 사용했지만 일반적으로 어떤 종류의 객체 시퀀스에도 사용할 수 있습니다. 이 내용에 대해서는 이후 장에서 자세히 알아보겠습니다.

C/C++/Java/C# 프로그래머를 위한 메모

파이썬의 for 문은 C/C++의 for 문과 현격히 다릅니다. C# 프로그래머라면 파이썬의 for 문이 C#의 foreach 문과 비슷하다고 느낄 것입니다. 자바 프로그래머라면 C# 프로그래머와 마찬가지로 자바 1.5의 for (int i : IntArray)와 비슷하다고 느껴질 것입니다.

C/C++에서 for (int i = 0; i < 5; i++)라는 코드를 작성하고 싶다면 파이썬에서는 for i in range(0,5)라고 쓰면 됩니다. 보다시피 for 문이 파이썬에서는 더 단순하고 더 표현력 있으며 에러가 발생할 가능성이 적습니다.

break 문

break 문은 반복문에서 빠져나오는(break out) 데 사용됩니다. 즉, 반복 조건이 False가 되지 않았거나 항목 시퀀스를 완전히 순회하지 않았을 때도 반복문의 실행을 중단하는 데 사용됩니다.

한 가지 중요한 점은 forwhile 문에서 break로 빠져나올 경우 else 블록은 실행되지 않는다는 점입니다.

예제(break.py):

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    print('Length of the string is', len(s))
print('Done')

출력 결과:

$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done

동작 원리

이 프로그램에서는 계속해서 사용자가 입력한 내용을 받아 길이를 출력합니다. 예제에서는 사용자가 입력한 내용이 'quit'인지 검사해서 프로그램의 실행을 중단하는 특별한 조건을 달았습니다. 이때 반복문에서 빠져나와 프로그램의 끝에 도달하는 식으로 프로그램을 중단합니다.

입력 문자열의 길이는 파이썬에 내장된 len 함수를 이용해 확인할 수 있습니다.

break 문을 for 문에서도 사용할 수 있다는 점을 기억하세요.

스와룹의 시적 파이썬

예제에서 입력한 문자열은 제가 쓴 짧은 시입니다.

Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!

continue

continue 문은 현재 반복문 블록의 나머지 문장을 건너뛰고 계속해서(continue) 반복문의 다음 반복을 진행하는 데 사용됩니다.

예제(continue.py):

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        print('Too small')
        continue
    print('Input is of sufficient length')
    # 이곳에서 다른 처리 내용을 수행합니다...

출력 결과:

$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit

동작 원리

이 프로그램에서는 사용자에게 입력을 받지만 입력 문자열의 길이가 최소 3글자 이상인 경우에만 처리합니다. 따라서 파이썬에 내장된 len 함수를 이용해 길이를 구한 다음, 문자열의 길이가 3글자 미만이면 continue 문을 이용해 반복문 블록의 나머지 문장을 건너뜁니다. 문자열의 길이가 3글자 이상이면 반복문의 나머지 문장을 실행해 하고 싶은 일을 처리합니다.

참고로 continue 문은 for 문에서도 동작합니다.

정리

지금까지 세 가지 제어문인 if, while, for를 비롯해 이와 연관된 breakcontinue 문의 사용법을 살펴봤습니다. 이것들은 파이썬에서 가장 흔히 사용되는 요소이므로 꼭 익혀두시길 바랍니다.

다음 장에서는 함수를 어떻게 만들고 사용하는지 알아보겠습니다.