while로 유명한 영어문장이 많이 있다.

 

산드라 블록 주연의 while you were sleeping 이란 클래식 영화가 있다.

While you were sleeping Trailer

while you were sleeping classic trailer

당시 한글로는 당신이 잠든 사이에 라고 번역을 해놨다. while 단어는 ~ 하는 동안에 라는 의미가 있다. 그런데 왜 이게 반복문이 되는 것일까?

 

캐임브리지 딕셔너리에 따르면 while의 정의는 다음과 같다.

 

during the time that, or at the same time as:

 

<어떤 시점 동안에, 혹은 동시에>

 

즉 반복문의 횟수를 정해놓은 것이라기 보다는 어떤 조건이 유지되는 동안에, 어떤 조건만 유지되면 이라는 뜻이라 볼 수 있다.

 

저 영화는 한 남자가 식물인간이 되어 있는 동안에 산드라 블록에게 일어나는 사건들이 주제가 된다. 당신이 병원에 잠들어있는 동안에 영화가 한참 진행되고 그 남자가 깨어나면서 결말을 맞이한다.

 

파이썬의 while문으로 표현하면 다음과 같다.

 

man = "sleeping"
minutes = 0

while man == "sleeping":
    print(minutes,end=" minutes : ")
    print("movie goes on")
    minutes += 20
    if 200 < minutes:
        print("he woke up")
        man = "waking"
        
print("End of the movie")

남자가 잠들어 있는 동안(while)에 영화는 진행이 된다. 그러다가 200분이 지나니까 (200 < minutes) -> True 남자가 일어나고 남자는 깨어난다. (waking) while 의 조건문은 False 가 되므로 영화는 끝이난다.

 

while 루프
흐름도 while 문

이렇게 상태를 유지시키면서 반복을 하는 제어문을 while 반복문이라고 한다. 반복문을 사용해서 1부터 1000까지 더해보겠다.

count = 0
sum = 0

while count < 1000:
    sum += count
    count += 1

print(sum)

#결과값
>> 499500


49만 정도의 값이 나온다. 그럼 다음은 1부터 1억까지 더해보겠다. 1억까지 더하는 것은 쉽지 않을 듯한데 사람이 하면 하루안에 할 수 있을라나 모르겠는데 일단 돌려본다.

 

import time

count = 0
sum = 0

start = time.time()

while count < 100000000:
    sum += count
    count += 1

end = time.time()

print(sum)
print(end - start)

1부터 1억까지 더하기

음... 결과값이 읽기가 어렵다. 일단 0이 15자리가 되고 연산하는데 걸린 시간은 23초다. 32비트 연산에 최적화된 컴퓨터 구조상 숫자의 크기가 늘어날 수록 시간이 더 걸리긴 한다. 어쨋든 코드 몇줄로 1억개의 숫자를 누산했다. 그것만으로도 while문의 엄청난 파워를 느낄 수 있으면 충분하다.

 

인간이 주판이나 계산기를 두드려서 하는 속도와는 비교가 안된다. 우리가 컴퓨터 프로그램이 느려진다고 하는 것은 거기에 한개의 컴퓨터에 너무 많은 기능을 담을 때 일어난다. 컴퓨터에게 한가지 일만 집중시켜주면 엄청난 효율을 보일 때가 있다. 왜 사람도 그럴때가 있지 않은가? 운동선수들이 인생의 리즈시절에 자기의 모든 능력을 발휘하는 순간이 있다. 먹고 자는 시간 이외에 철저하게 운동만 하는 것이다.

 

while 반복문의 구조를 한번 뜯어보자. 좀 이해가 안될 때 이런일을 해보면 의미가 있다.

 

count = 0
sum = 0

while count < 10:
    sum += count
    count += 1

print(sum)

wihle 문

1부터 10까지 더하는데 컴퓨터는 이런 작업을 한다. 그리고 이 작업을 1억까지 시키는데 글쓴이의 PC에서는 23초가 걸렸다. PC 사양이 최신형은 아니라서 요새 출시되는 상급 컴퓨터로 작업하면 두배 이상 빨라질 것이다. 

 

이 작업을 시키는데 소스코드는 10줄도 필요가 없다. 줄수 걱정보다 코드가 잘 읽히도록 공백을 넉넉히 주는게 중요하다.

 

import random

number = 0
r1 = random.randint(1, 5)

while number != r1:
    number = int(input("숫자를 맞춰보세요 1~5 : "))

print("성공입니다!")

이 코드는 랜덤 숫자를 맞추는 루프이다. 1에서 5까지의 숫자가 한번 생성된다. 사용자는 맞을 때까지 입력하고 number 와 r1이 값이 같아지면 조건식이 False 가 되어 while 루프를 종료한다. random 은 파이썬 기본 라이브러리에서 import할 수 있다.

 

랜덤 숫자 맞추기

*break 문

break문은 while문을 탈출할 수 있는 또 하나의 방법이다. 사실 어떤 프레임워크들은 이 방법을 선호한다. 프로그램을 진행하다 보면 다시 모든 코드를 거쳐서 시작지점으로 돌아올 필요가 없는 경우도 있다. 보통 while문 안에 if문을 사용해서 특정 조건을 확인 한 후에 break를 건다.

 

count = 0

while count < 100:
    print("count : ",count)
    if count == 30:
        break
    count += 1

print("End")


#결과창
count :  0
count :  1
count :  2
count :  3
count :  4
count :  5
count :  6
count :  7
count :  8
count :  9
count :  10
count :  11
count :  12
count :  13
count :  14
count :  15
count :  16
count :  17
count :  18
count :  19
count :  20
count :  21
count :  22
count :  23
count :  24
count :  25
count :  26
count :  27
count :  28
count :  29
count :  30
End

 

count가 30에 도달하자 break를 통해 while 문을 빠져나온다. 이와 대응되는 것이 continue 문이다.

 

*continue 문

count = 0

while count < 50:
    count += 1
    if count%2 == 0:
        continue
    print("count : ",count)

print("End")

이 코드는 0부터 49까지 짝수만 걸러낸다. continue문을 만나면 그 아래의 문장들은 실행되지 않고 다시 while의 조건문으로 가서 평가한다.

 

#결과값 짝수를 거른다

count :  1
count :  3
count :  5
count :  7
count :  9
count :  11
count :  13
count :  15
count :  17
count :  19
count :  21
count :  23
count :  25
count :  27
count :  29
count :  31
count :  33
count :  35
count :  37
count :  39
count :  41
count :  43
count :  45
count :  47
count :  49
End

Process finished with exit code 0

 

*무한루프

무한루프(LOOP)는 무한히 반복되는 것이다.

 

거의 대부분의 애플리케이션이 무한루프를 사용한다. OS도 사용하고 있고 무한루프는 기계의 특성이고 숙명이다.

 

어차피 무한 루프의 소개는 뻔하다. while True: 이것 밖에 없다.

 

그러니까 Pygame 프레임워크의 무한루프를 한번 보고간다.

import pygame

screen = pygame.display.set_mode((640,320))
pygame.init()

evcount = 0
running =True
while running:
    for pyEvent in pygame.event.get():
        print(evcount,end=' : ')
        print(pyEvent)
        evcount += 1
        if pyEvent.type == pygame.QUIT:
            running = False
pygame.quit()

윈도우 창을 띄워서 이벤트를 계속 파악하는 코드이다. 윈도우 창이 열려있을 때 앱은 정지해 있는 것이 아니라 끓임없이 무한루프를 돌며 이벤트를 듣고 있는 것이다(listen event)

 

Pygame 의 윈도우 이벤트

카운터를 보면 몇초사이에 이벤트를 740개나 발생시켰다. 이것들은 while 무한루프로 처리되고 있다.

 

다음 포스트는 반복문이지만 용도가 다른 for 루프에 대한 내용이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band