클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

프로그램의 구조를 쌓는다! 제어문 5 - while 문 1 : 기본 내용 학습하기 본문

프로그래밍 언어/파이썬

프로그램의 구조를 쌓는다! 제어문 5 - while 문 1 : 기본 내용 학습하기

huenuri 2024. 9. 3. 13:36

이제 while 문에 대해서 공부해볼 것이다. 벌써 4교시가 되어 아침 공부할 시간이 1시간밖에 없지만 오늘부터 3일 동안은 점심에 집에 가지 않고 계속해서 나만의 공부방에서 공부를 할 생각이다. 

문장을 반복해서 수행해야 할 경우 while 문을 사용한다. 그래서 while문을 반복문이라고도 부른다. 이 부분은 자바와 C 언어 계열의 프로그래밍에서 벌써 5번째 공부하고 있으니 파이썬에서의 특징을 간단히 살펴보면 될 것 같다.


 

 

 

while 문의 기본 구조

 

 

 

 

 

 

 

while 문은 조건문이 참인 동안 while 문에 속한 문장들이 반복해서 수행된다. 열 번 찍어 안 넘어가는 속담을 파이썬 프로그램으로 만들면 다음과 같다.

 

 

 

treeHit < 10 조건문은 거짓이므로 while 문을 빠져나간다. 파이썬에서는 ++을 지원하지 않는다고 한다. 이를 표로 정리하면 다음과 같다.

 

treeHit 조건 판단 수행하는 문장 설명(while문 동작)
0 treeHit < 10 (True) treeHit = treeHit + 1 treeHit가 1로 증가한다.
1 treeHit < 10 (True) print("나무를 %d번 찍었습니다." % treeHit) "나무를 1번 찍었습니다."가 출력된다.
1 treeHit == 10 (False) (아무 작업 없음) 나무를 찍은 횟수가 10이 아니므로 다음 반복으로 이동한다.
2 treeHit < 10 (True) treeHit = treeHit + 1 treeHit가 2로 증가한다.
2 treeHit < 10 (True) print("나무를 %d번 찍었습니다." % treeHit) "나무를 2번 찍었습니다."가 출력된다.
2 treeHit == 10 (False) (아무 작업 없음) 나무를 찍은 횟수가 10이 아니므로 다음 반복으로 이동한다.
3 treeHit < 10 (True) treeHit = treeHit + 1 treeHit가 3으로 증가한다.
3 treeHit < 10 (True) print("나무를 %d번 찍었습니다." % treeHit) "나무를 3번 찍었습니다."가 출력된다.
3 treeHit == 10 (False) (아무 작업 없음) 나무를 찍은 횟수가 10이 아니므로 다음 반복으로 이동한다.
... ... ... ...
9 treeHit < 10 (True) treeHit = treeHit + 1 treeHit가 10으로 증가합니다.
10 treeHit < 10 (False) (반복 종료) treeHit가 10이므로 조건문을 탈출한다.
10 treeHit ==10 (True) print("나무가 넘어갑니다.") "나무가 넘어갑니다."가 출력된다.

 


 

 

 

while 문 만들기

여러 가지 선택지 중 하나를 선택해서 입력 받는 예제를 만들어보자. 먼저 다음과 같은 문자열을 만든다.

큰따옴표를 3개 쓰면 문장이 내려가도 그 부분을 모두 하나로 처리한다.

 

 

4를 입력하기 전까지는 계속 while 문이 반복된다.

 


 

 

 

 

whlie 문 강제로 빠져나가기

while 문을 빠져나가고 싶을 때는 break를 사용해서 빠져나올 수 있다.

 

 

 

이렇게 코드를 작성했는데 비주얼 코드에서는 모를까 주피터 노트북에서는 실행이 되지 않았다. 그 이유는 while money: 조건문이 무한 루프에 빠질 수 있기 때문이다.

 

문제 분석

코드의 주요 문제는 while money: 조건이 항상 True이기 때문에 무한 루프에 빠질 수 있다는 점이다. 파이썬에서 숫자형 변수는 0이 아닌 경우 True로 평가되므로, money가 0이 아닌 한 while 루프는 계속 반복된다.

 

문제점

  1. 무한 루프
    • money 변수는 변경되지 않으므로 항상 300이다. 따라서 while money:는 계속해서 True로 평가되어 무한 루프에 빠진다.
  2. 사용자 입력 없음
    • 자판기의 돈 투입과 커피 감소 등의 로직이 전혀 변경되지 않는 상태에서 반복되기 때문에 실제 자판기의 동작과는 다르다.

해결 방법

  1. 사용자 입력을 통해 돈을 감소시키거나 종료하도록 수정
    • input() 함수를 사용하여 사용자가 돈을 투입하도록 하고, 돈이 충분하지 않으면 루프를 종료하는 방식으로 코드를 수정할 수 있다.
  2. 조건을 적절히 설정하여 루프를 빠져나오도록 설정
    • money 변수를 0으로 설정하거나, 반복문이 돈이 있을 때와 커피가 있을 때만 실행되도록 조건을 설정한다.

 

 

코드 수정해보기

 

 

하지만 커피가 얼마 남았는지도 모르고 계속 해서 돈을 넣으라는 루프가 반복되어 정말 불편하다. 이 코드를 다음과 같이 수정해보았다.

 

 

파이썬 프로그램으로 하니 잘만 실행되었다. 이제 실제 자판기처럼 만들어보기로 하자.


 

코드 최종 수정하기

 

처음에는 커피의 남은 양이 else 구문에서만 실행되어 돈이 300원보다 더 적을 때만 커피의 양을 계산했다. 이번에는 구문 밖으로 빠져나와 커피를 준 다음에 계속 실행이 되도록 바꾸었다. 커피도 10개에서 5개로 줄여보았다.

 

 

 

 

 

 

 


 

 

 

while 문의 맨 처음으로 돌아가기

 

 

while 문을 빠져나가지 않고 while 문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶은 경우가 생긴다. 이때 사용하는 것이 continue 문이다.

 

 

 

a가 짝수일 때는 앞의 조건문으로 돌아가고 홀수일 때만 출력이 되는 코드이다.

 


 

 

 

 


 

 

 

무한 루프

무한 루프란 무한히 반복한다는 의미이다. 파이썬에서 무한 루프는 while 문으로 구현할 수 있다.

while 문의 조건문이 True 이므로 항상 참이 된다. 따라서 while 문 안에 있는 문장들은 무한히 수행될 것이다.

 

 

 

주피터 노트북에서는 무한 루프를 실행할 수 없었다. 비주얼 코드에서 실행을 했는데 갑자기 노트북의 소리가 커지면서 과부하가 걸릴 것 같아서 껐다.

 

 

 

주피터 노트북으로 할 때는 절대로 실습할 수 없는 문제였으나 파이썬으로 하니 잘 된다.


 

 

학습을 마치고

오늘 4시와 점심시간에 30분을 이용해 while 문 학습을 진행했다. 책에 있는 내용만 하는데도 하나하나 예제를 풀어보니 시간이 많이 걸렸다. 이제 수업 영상을 들으면서 while 문 관련 문제들을 더 많이 풀어보려고 한다.