4) while문 (2)

while문 빠져 나가기(break)

 

  while 문은 조건문이 참인 동안 계속해서 while문 안의 내용을 수행하게 된다.

하지만 강제로 while문을 빠져나가고 싶을 때가 생기게 된다.

  커피 자판기를 생각해 보자. 커피가 자판기 안에 충분하게 있을 때는 항상 “돈을 받으면 커피를 줘라” 라는 조건문을 가진 while문이 수행된다.

자판기가 제 역할을 하려면 커피의 양을 따로이 검사를 해서 커피가 다 떨어지면 while문을 멈추게 하고 “판매중지”란 문구를 자판기에 보여야 할 것이다.

  이렇게 while문을 강제로 멈추게 하는 것을 가능하게 해 주는 것이 바로 break이다.

다음의 예는 위의 가정을 파이썬으로 표현해 본 것이다.

 

  예) break의 사용

 

>>> coffee = 10
>>> money = 300
>>> while money:
...     print("돈을 받았으니 커피를 줍니다.")
...     coffee = coffee -1
...     print("남은 커피의 양은 %d 입니다." % coffee)
...     if not coffee:
...         print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
...         break
...

 

  money가 300으로 고정되어 있으니까 while money:에서 조건문인 money는 0이 아니기 때문에 항상 참이다.

따라서 무한 루프를 돌게 된다.

그리고 while문의 내용을 한번 수행할 때 마다 coffee = coffee - 1에 의해서 coffee의 개수가 한 개씩 줄어들게 된다.

  만약 coffee가 0이 되면 if not coffee: 라는 문장에서 not coffee가 참이 되므로 if문 다음의 문장들이 수행이 되고 break가 호출되어 while문을 빠져 나가게 된다.

하지만 실제 자판기는 위처럼 작동하지는 않을 것이다.

다음은 자판기의 실제 과정과 비슷하게 만들어 본 예이다.

이해가 안 되더라도 걱정하지 말자.

  아래의 예는 조금 복잡하니까 대화형 인터프리터를 이용하지 말고 에디터를 이용해서 작성해 보자.

 

# -*- coding: utf-8 -*- 
# coffee.py

coffee = 10
while True:
    money = int(input("돈을 넣어 주세요: "))
    if money == 300:
        print("커피를 줍니다.")
        coffee = coffee -1
    elif money > 300:
        print("거스름돈 %d를 주고 커피를 줍니다." % (money -300))
        coffee = coffee -1
    else:
        print("돈을 다시 돌려주고 커피를 주지 않습니다.")
        print("남은 커피의 양은 %d개 입니다." % coffee)
    if not coffee:
        print("커피가 다 떨어졌습니다. 판매를 중지 합니다.")
        break

 

  위의 프로그램 소스를 따로 설명하지는 않겠다.

위의 것을 이해할 수 있다면 지금껏 알아온 if문이나 while문을 마스터 했다고 보면 된다.

  다만 money = int(input(“돈을 넣어 주세요: ”))라는 문장은 사용자로부터 입력을 받는 부분이고 입력 받은 숫자를 money라는 변수에 대입하는 것이라고만 알아두자.

 

※ 파이썬 2.7 버전을 사용한다면 위 소스코드에서 input("돈을 넣어 주세요: ") 대신 raw_input("돈을 넣어 주세요: ")으로 사용해야 하며 소스코드 가장 첫줄에 다음과 같은 문자열을 반드시 넣어주어야만 한다. (참고: 파이썬 2.7 vs 파이썬 3)
# -*- coding: utf-8 -*-

 

  만약 위의 프로그램 소스를 에디터로 작성해서 실행시키는 법을 모른다면 부록의 "에디터 사용법"을 참고하도록 하자.

 

조건문으로 돌아가기(continue)

 

  while문 안의 문장을 수행할 때 어떤 조건을 검사해서 조건에 맞지 않는 경우 while문을 빠져나가는 것이 아니라 다시 while문의 맨 처음(조건문)으로 돌아가게 하고 싶을 경우가 생기게 된다.

  만약 1부터 10까지의 수중에서 홀수만을 출력하는 것을 while문을 이용해서 작성한다고 생각해 보자. 어떤 방법이 좋을까?

 

      예) continue의 사용

>>> a = 0
>>> while a < 10:
...     a = a+1
...     if a % 2 == 0: continue
...     print(a)
...
1
3
5
7
9

 

  위의 예는 1부터 10까지의 수 중 홀수만을 출력하는 예이다.

a가 10보다 작은 동안 a는 1만큼씩 계속 증가한다. if a % 2 == 0 (2로 나누었을 때 나머지가 0인 경우)이 참이 되는 경우는 a가 짝수일 때이다.

  즉, a가 짝수이면 continue 문장을 수행한다. 이 continue문은 while문의 맨 처음(조건문: a<10)으로 돌아가게 하는 명령어이다.

따라서 위의 예에서 a가 짝수이면 print(a)는 수행되지 않을 것이다.

 

예제를 연습해 봅시다