티스토리 뷰

카테고리 없음

제어문

43ver 2018. 1. 16. 13:14

while반복문

"I can code too!"라는 문자열을 10번 출력하려면 print("I can code too!")라는 코드를 10번 반복해서 쓰면 됩니다.

print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
print("I can code too!")
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!

하지만 똑같은 코드를 반복하는 것은 프로그래머로서 용납할 수 없는 일입니다. 이럴때에는 while 반복문을 떠올려야 합니다.

while문의 문법 구조는 다음과 같습니다:

1. while 조건부분:
2.     실행할 문장 1
3.     실행할 문장 2
4.     실행할 문장 3

while 반복문은 조건부분(header)과 수행부분(body)으로 나뉩니다. 위의 문법 구조에서 (1)번 줄이 조건부분에, (2)~(4)번 줄이 수행부분에 해당됩니다.

파이썬이 while 반복문의 조건부분에 도착하면 다음과 같은 일들이 발생합니다:

  1. 파이썬은 조건부분의 결과값(불린값)이 True인지 False인지 체크합니다.
  2. 조건부분이 True면, 파이썬은 반복문의 수행부분을 실행합니다. 그리고 수행부분이 끝나면 다시 조건부분으로 돌아갑니다.
  3. 조건부분이 False면, 파이썬은 while 반복문의 수행부분을 건너 뛰어 그 이후의 코드를 실행합니다.

while문의 문법 구조를 참고하여, "I can code too!"를 10번 출력하는 프로그램을 작성해보도록 합시다.

1. i = 1
2. while i <= 10:
3.     print("I can code too!")
4.     i = i + 1
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
I can code too!
  1. (1)번 줄에서 변수 i에 1의 값이 지정됩니다.
  2. (2)번 줄에서 i <= 10는 True이기 때문에 파이썬은 while문의 수행부분으로 들어갑니다.
  3. (3)번 줄에서 콘솔에 "I can code too!"라는 문자열이 출력됩니다.
  4. (4)번 줄에서 변수 i의 값에 1이 추가됩니다. 지정 연산자 기억하시죠?
  5. 조건부분이 False가 될 때까지, 즉 i가 10보다 큰 값을 갖게될 때까지, (2)~(4)번의 과정이 반복됩니다.
  6. 조건부분이 False가 되면, 파이썬은 반복문을 빠져나오고 프로그램은 끝납니다.

위 예시는 간단하기 때문에, 누군가는 "이 단순한 예시에 왜 복잡하게 반복문까지 쓸까?"하는 생각을 할 수도 있습니다. 하지만 "I can code too!"를 100번 출력하는 프로그램을 만들려고 한다면 어떻게 해야할까요? print문만 사용하면 100개의 print문을 직접 써야하지만, 반복문을 사용하면 위의 코드에서 숫자 10을 100으로 바꾸어주기만 하면 됩니다.

이제 반복문을 쓰는 이유를 아시겠나요? 반복문은 귀찮은 작업을 컴퓨터에게 떠넘기기 위한 용도입니다. 컴퓨터는 반복적인 일을 아무런 불평없이 하는 최강의 도구 아닙니까?

좋은 소프트웨어 엔지니어가 되려면 게을러져야 합니다. 귀찮은 일을 싫어해야 합니다. 역설적이죠? 100줄의 코드를 직접 쓰기보다, 컴퓨터에게 맡기기를 원해야 합니다. 매일 2시간씩을 들여 이름, 나이, 전화번호, 주소 등의 정보를 직접 분류하기보다, 총 10시간을 들여 코딩을 한 후 컴퓨터가 매일 알아서 해주기를 원해야 합니다.

컴퓨터 과학에서 다루는 여러 도구(tool)들을 배워서, 게으른 소프트웨어 엔지니어가 되세요. 어떻게 하면 똑똑한 프로그램을 작성할 수 있을지, 효율적(efficient)인 알고리즘을 작성할 수 있을지 끊임없이 고민해보세요.

유상무 잘 생겼다

호미빙의 CEO인 개그맨 유상무씨가 생일 이벤트를 열었었습니다. 네이버에 '유상무 잘생겼다'를 검색해서 검색한 순위의 끝 두자리가 35이면 아메리카노 무료 기프티콘을 주는 이벤트였죠. 그 당시 하루 동안의 총 검색수가 무려 8천만번이었다고 합니다. 어마어마하죠? 유상무씨는 그로 인해 음료값 8억원과 메시지 발송비용 8천만원이 들었다고 합니다.

방송에서는 "파산할 지경이었다", "돈이 많이 들었다"고 이야기하기 하지만, 그만큼 호미빙의 홍보 효과도 어마어마했겠죠? 어찌되었든 아주 재미있는 이벤트였습니다.

이 이벤트에 당첨되기 위해 사람들은 계속해서 '유상무 잘생겼다'를 검색했어요. 확률이 1/100이니까요. 그렇지만 소프트웨어 엔지니어들은 1/100의 확률을 1로 만들 수 있는 능력자입니다. 당첨될 때까지 컴퓨터가 스스로 검색하도록 프로그램을 만들 수 있기 때문이죠. 실제로 개발자 이두희씨는 페이스북에 '자동으로 검색해서 번호를 뽑아내는 걸 짰다. 지금부터 돌리면 아메리카노 2015년 내내 공짜로 마실 수 있을 것 같다.'고 글을 작성했었습니다. 어떻게 이런 코드를 작성한 것일까요?

while True:
    네이버에 "유상무 잘생겼다"를 검색한다

위는 파이썬으로 그 코드를 아주 단순화하여 나타낸 것입니다. 만약 이벤트에 딱 세번만 당첨되고 싶다면 어떻게 할까요?

coffee_count = 0
while coffee_count는 3보다 작다:
    네이버에 "유상무 잘생겼다"를 검색한다
    당첨되면 coffee_count의 값을 1늘린다

위의 코드에는 당첨되면이라는 조건이 있죠? 이 코드를 보다 자세하게 작성하기 위해서는 if문이 필요합니다. 다음 강의에서 이에 대해 자세히 배워보도록 하겠습니다.


if/elif/else

while문의 경우 조건부분이 True일 동안에 수행부분이 계속 실행되었었죠? 하지만 if문은 조건부분이 참일 때 수행부분이 딱 한 번만 실행됩니다. 이 때문에 while문은 반복문(loop)이라고 부르고, if문은 조건문(conditional)이라고 부릅니다.

if문

정수 a가 정수 b보다 작은 경우 "a는 b보다 작습니다."를 출력하는 프로그램을 만들어봅시다.

1. a = 3
2. b = 5
3. 
4. if a < b:
5.     print("a는 b보다 작습니다.")
a는 b보다 작습니다.

코드의 (1)~(2)번 줄을 보시면 a의 값은 3이고, b의 값은 5입니다. (4)번 줄의 조건 부분은 3 < 5 True입니다.

따라서 if문의 조건 부분이 한번 실행됩니다. 결과적으로 "a는 b보다 작습니다."가 출력됩니다. 만약 a b보다 크거나 같았다면, if문은 실행되지 않고 아무것도 출력되지 않았을 것입니다.

if문과 else문

만약 a b보다 크거나 같을 때, "a는 b보다 작지 않습니다."를 출력하고 싶다면 어떻게 해야할까요? if문과 함께 else문을 사용하면 됩니다.

a = 5
b = 3

if a < b:
    print("a는 b보다 작습니다.")
else:
    print("a는 b보다 작지 않습니다.")
a는 b보다 작지 않습니다.

else문의 수행부분은 if문의 조건부분이 False일때 실행됩니다. 따라서 else문은 별도의 조건문이 없습니다.

위의 코드를 보시죠. a 5이고, b 3이기 때문에, if문의 조건 부분인 5 < 3 False입니다. 파이썬은 if문의 수행부분에 들어가지 않고 else문의 수행부분에 들어가서 "a는 b보다 작지 않습니다."가 출력됩니다.

if문, elif문, else문

세 가지 경우를 구분하여 각각 "a는 b보다 작습니다." "a와 b는 같습니다." "a는 b보다 큽니다."를 출력하고 싶다면 어떻게 해야할까요? 여태까지 배운 if문과 else문만 활용한다면 아래와 같이 표현할 수 있습니다.

a = 5
b = 3

if a < b:
    print("a는 b보다 작습니다.")
else:
    if a == b:
        print("a와 b는 같습니다.")
    else:
        print("a는 b보다 큽니다.")
a는 b보다 큽니다.

a b의 대소를 판단하는 기준이 세 가지 밖에 없기 때문에 위의 코드가 간단해보일 수도 있습니다. 하지만 10개의 경우의 수를 구분해야 하는데, if else 두 개만 활용해서는 코드가 길어지고 복잡해지겠죠?

다행히 else문과 if문을 합친 elif문이 있습니다. elif문을 써서 a b보다 작은지, 같은지, 큰지 판단해보겠습니다.

a = 5
b = 3

if a < b:
    print("a는 b보다 작습니다.")
elif a == b:
    print("a와 b는 같습니다.")
else:
    print("a는 b보다 큽니다.")
a는 b보다 큽니다.

왜 이런 결과가 나왔는지 분석해보겠습니다. 처음에 쓰인 if문의 조건 부분은 5 < 3으로 False입니다. 앞에 있는 if문이 거짓이기 때문에, 중간에 있는 elif문이 True인지 False인지 판단할 기회가 주어집니다. 만약 앞에 있는 if문이 True였다면, 그런 기회조차 없었겠죠.

elif문의 조건부분은 5 == 3으로 False입니다. 앞에 있는 if문과 중간에 있는 elif문이 모두 False였기 때문에, else문의 수행부분이 실행됩니다. 결과적으로 "a는 b보다 큽니다."가 출력됩니다.

if, elif, else를 쓸 때에는 이 규칙을 따르면 됩니다:

  1. 처음에 if문은 꼭 써야합니다.
  2. 중간에 elif문은 0번 이상, 원하는 횟수만큼 쓰면 됩니다.
  3. 마지막에 else문은 0번 또는 1번 쓸 수 있습니다.

파이썬은 순서대로 코드를 읽어내려가는데 if문의 조건문이 False일 때에만 elif문으로 넘어가고 (elif문이 하나라도 있다면), elif문의 조건문이 False여야만 그 다음 elif문 또는 else문으로 넘어갑니다. 만약 if문의 조건부분과 모든 elif문의 조건부분이 False면, 파이썬은 else문의 수행부분을 실행합니다 (else문이 있다면).

유상무 잘 생겼다

앞서 '유상무 잘 생겼다' 프로그램은 while문을 적용해 설명했었죠?

아메리카노 커피 이벤트에 세번 당첨되고 싶을 때 아래의 코드를 썼습니다.

coffee_count = 0
while coffee_count는 3보다 작다:
    네이버에 "유상무 잘생겼다"를 검색한다
    당첨되면 coffee_count의 값을 1늘린다.

그런데 (4)번 줄의 당첨되면이라는 말은 '조건'을 나타내는 부분이어서 if문을 배운 뒤 더 자세히 나타낼 수 있다고 했었죠? 검색 등수의 끝 두 숫자가 35일 때 당첨이 되는 구조였기 때문에, 아래와 같이 코드를 구체화할 수 있습니다.

coffee_count = 0
while coffee_count는 3보다 작다:
    네이버에 "유상무 잘생겼다"를 검색한다
    if 검색 등수의 끝 두 숫자가 35일 때:
        coffee_count의 값을 1 늘린다.

날씨 알리미

온도에 따라 입고 나가야 할 옷을 알려주는 프로그램을 작성해보았습니다. 강의에서는 이를 가짜 코드(pseudocode)로만 썼으니, 제대로 된 파이썬 프로그램을 작성해봅시다.

temp = 13

if temp <= 5:
    print("내복과 긴팔과 자켓을 입으세요.")
elif temp <= 10:
    print("긴팔과 자켓을 입으세요.")
elif temp <= 15:
    print("긴팔을 입으세요.")
else:
    print("반팔을 입으세요.")
긴팔을 입으세요.


꿀팁

break문

만약 while문의 조건부분과 상관 없이 반복문에서 나오고 싶으면 break문을 쓰면 됩니다.

i = 100
while True:
    # i가 23의 배수면 반복문을 끝냄
    if i % 23 == 0:
        break
    i = i + 1

print(i)
115

continue문

만약 현재 진행되고 있는 수행부분을 중단시키고 바로 조건부분을 다시 확인하고 싶으면 continue문을 쓰면 됩니다.

i = 0
while i < 15:
    i = i + 1

    # i가 홀수면 print(i) 안하고 바로 조건부분으로 돌아감
    if i % 2 == 1:
        continue
    print(i)
2
4
6
8
10
12
14


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함