이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

같은 코드를 반복해서 실행하기

김씨는 푸드파이터다. 오늘도 그는 위장단련을 위해 돈 50000원을 들고 나와서 식당 하나를 잡고 돈을 다 쓸 때 까지 음식을 시켜 먹으려고 한다.

그러면 이 동작을 수행하는 코드를 작성한다고 생각해보자. 김씨가 음식을 먹을 때 마다 ‘냠냠’이란 단어를 출력한다고 했을 때, 코드를 어떻게 작성해야 할까?

동작을 살펴보니 돈을 다 쓸 때 까지 라는 조건이 보인다. 그러면 저번에 배운 조건문을 써 먹을 차례가 아닐까?

if money >= foodCost :
	print('냠냠')
	money -= foodCost

하지만 이렇게 조건문을 하나만 붙여서는 돈을 다 쓸 때 까지 코드를 실행하는 것이 아니다. 위의 코드 대로라면 돈이 음식을 10번은 먹을 수 있는 돈이 있다고 하더라도 한번만 먹고 끝나게 된다.
그러면 위의 코드를 많이 만들면 되지 않을까?

if money >= foodCost :
	print('냠냠')
	money -= foodCost
if money >= foodCost :
	print('냠냠')
	money -= foodCost
if money >= foodCost :
	print('냠냠')
	money -= foodCost
...

조건문이 10개 정도가 있다면 음식을 10번 먹는 동작은 될 것 같다. 하지만 돈이 더 생겨서 11번 먹을 수 있는 돈이 되었다면? 11개로 늘린다 해도 그 다음에 나올 이야기는 “그럼 12번 먹을 수 있는 돈이 있다면?”이다. n개의 조건문을 걸어도 n+1번 반복해야 하는 상황이 발생하면 안된다.

이럴때 필요한 것이 동일한 코드를 반복해서 실행하는 기능, 반복문이다. 동일한 코드를 필요할 때 까지 반복해서 실행하게 해준다. 그러면 위의 코드처럼 똑같은 코드를 복사/붙여넣기 할 필요가 없어지게 되는 것이다.

 

while

가장 먼저 알아볼 반복문 기능은 while이다. 영어 사전을 찾아보면 “~ 하는 동안”이란 뜻임을 알 수 있다. 그러면 Python에서는 이 while이 어떻게 쓰이는걸까?

while condition :
    code

while은 반복문을 사용하기 위한 단어다.
conditon은 반복문을 수행하기 위핸 조건이다.
code는 condition이 True라면 실행하고 다시 한번 condition을 확인한다. 만약 condition이 False라면 반복문 실행을 멈추고 다음으로 넘어간다.

그러면 푸드파이터 코드는 어떻게 작성하면 되는지 살펴보자.

 

foodFighter.py

money = 10000
foodCost = 5000

while money >= foodCost :
    print('냠냠')
    money -= foodCost

 

그러면 이 코드가 어떻게 동작하는지 흐름을 따라가보자.

푸드파이터가 가진 돈 money는 10000원이다.
음식값 foodCost는 5000원이다.

그러면 이제 while문을 살펴보자. condition에 해당하는 부분은 money >= foodCost이다. 푸드파이터가 가지고 있는 돈은 10000원이고, 음식값은 5000원이다. 10000은 5000이상이다. 따라서 money >= foodCost는 참이다. 그러므로 code를 실행해야 한다. 그러면 ‘냠냠’을 출력하고, 푸드파이터가 가지고 있는 돈을 음식가격만큼 빼 준다. (즉, 돈을 사용하는 동작을 표현하는 것이다)
이제 푸드파이터가 가진 돈 money는 5000원이다.
음식값 foodCost는 여전히 5000원이다.

방금 condition이 참이었으므로, 다시 한번 condition을 확인해야 한다. 푸드파이터가 가진 돈 money와 음식값 foodCost는 5000으로 똑같다. 그러므로 money >= foodCost는 여전히 참이다. 따라서 code를 실행해야 한다. ‘냠냠’을 출력하고, 푸드파이터가 가지고 있는 돈을 음식가격만큼 빼 준다.
이제 푸드파이터가 가진 돈 money는 0원이다. 음식값 foodCost는 여전히 5000원이다.

또 다시 condition을 확인해야 한다. 하지만 이번에는 moneyfoodCost보다 작다. 따라서 이제는 condition이 거짓이 된다. 그러면 이제 반복문을 마치고, 다음 코드로 넘어가게 된다. 위의 코드에서는 다음 코드는 없으므로, 여기서 끝나게 된다.

그러면 최종적으로 출력된 결과는 ‘‘냠냠’’ 2번이다. 그리고 푸드파이터가 가지고 있는 돈 10000원으로는 5000원 짜리 음식을 2개 사 먹을 수 있으므로 이 코드는 정상적으로 동작했다고 볼 수 있다.

 

무한 루프(Infinite Loop)

foodFighter.py에서 다음 코드가 없었다면 어떻게 될까?

money -= foodCost

그러면 푸드파이터 김씨는 돈을 내지 않고 음식을 먹는 것과 같은 동작을 수행하게 된다.
음식은 먹었지만, 돈은 내지 않는다. 따라서 푸드파이터가 가지고 있는 돈이 줄어들지 않는다. 그러면 money >= foodCost는 항상 참이 된다. 그러면 while은 영원히 빠져나갈 수 없는 것일까?

그렇다. 이렇게 되면 푸드파이터 김씨는 영원히 음식을 먹어야 하는 지옥에 빠지게 되는 것이다. 실제로 음식을 먹는 코드인 money -= foodCost를 빼고 코드를 실행한다면, ‘냠냠’이 끝없이 출력되는 것을 볼 수 있을 것이다.

이를 무한 루프(Infinite Loop)라고 부른다. 루프는 반복을 의미한다. 그리고 무한은 끝없이 계속 됨을 의미한다. 즉, 반복문을 끝없이 반복한다는 것을 의미한다.

무한 루프가 필요한 곳도 있겠으나(사용자의 입력을 끊임없이 받아들여야 한는 프로그램이라던가), 위와 같이 의도치 않은 무한 루프는 사실상 버그나 다름없다. 우리의 의도는 김씨의 돈 만큼 음식을 먹는거지만, 실제 동작은 돈이 음식 값만큼만 있으면 무한대로 흡입하는 동작이 되어버렸다.

따라서, 반복문을 작성할 때는 반복문 내부의 코드인 codecondition이 영향이 가도록 작성해야 한다.

푸드파이터 코드에서는 condition의 조건인 김씨의 돈이 code에서 계속해서 음식 값 만큼 차감되도록 하고 있다. 따라서 음식을 계속 먹다가 가진 돈이 부족해지면 반복문을 탈출할 수 있게 되는 것이다.

 

루프 탈출하기 (break)

푸드파이터도 사람이다. 김씨가 먹을 수 있는 음식의 양도 한계가 있다. 만약 자신이 먹을 수 있는 양 보다 더 많은 양의 음식을 먹으려고 할 경우, ‘더는 못먹겠어…’ 라는 말과 함께 먹는 것을 중단하는 동작도 추가한다고 해 보자.
그러면 지금까지 먹은 음식의 수를 표현하는 변수와 최대로 먹을 수 있는 음식의 수를 표현하는 변수를 추가해야 할 것이다. 이 변수의 이름은 각각 foodCountmaxFoodCount로 정하자.

money = 100000
foodCost = 5000
foodCount = 0
maxFoodCount = 10

while money >= foodCost and foodCount < maxFoodCount :
    print('냠냠')
	money -= foodCost
	foodCount += 1

if money >= foodCost and foodCount == maxFoodCount :
    print('더는 못먹겠어...')

이렇게 하면 되긴 된다. ‘더는 못먹겠어’는 음식을 먹을 수 있는 돈이 남아 있는데도 더 이상 먹을 수 없을 때 나와야 하는 말이기 때문에 money >= foodCost도 확인 해야한다.

또 다른 방법이 있다. 반복문을 탈출하도록 해 주는 마법의 기능, break를 사용하는 방법도 있다. 반복문을 실행하는 도중에 break를 만나면, condition에 상관없이 현재 수행중인 반복문을 탈출하게 해 준다.

while True:
   break

위의 코드의 경우, condition은 True지만, code에 break가 있어서 바로 탈출하게 되는 반복문이다.

그러면 푸드파이터 코드에서 break를 어떻게 사용하면 될까?
while에서 확인하는 condition은 현재 돈이 충분한가만 확인하고, 반복문 안의 code에서 현재 먹은 양이 최대로 먹을 수 있는 음식의 양보다 같을 경우 ‘더는 못먹겠어…‘와 break를 실행하도록 하면 될 것이다.

그러면 break를 추가한 푸드파이터 코드를 작성해보자.

 

foodFighter_break.py

money = 100000
foodCost = 5000
foodCount = 0
maxFoodCount = 10

while money >= foodCost:
    if foodCount == maxFoodCount :
        print('더는 못먹겠어...')
        break
    print('냠냠')
    money -= foodCost
    foodCount += 1

 

Categories:

Updated:

Comments