반복문
반복문(iteration statements)
현실 세계의 많은 문제들은 대체로 반복적인 형태를 하고 있는 것이 많습니다. 이것은 곧 어떤 조건을 만족시킬 때까지 특정 행동을 지속적으로 반복해서 수행해야 한다는 의미입니다.
프로그래밍에서 이러한 반복 작업은 다음 예제처럼 단순히 소스 코드를 반복해서 작성해도 원하는 결과를 얻을 수 있습니다.
예제
print("파이썬 1")
print("파이썬 2")
print("파이썬 3")
print("파이썬 4")
print("파이썬 5")
print("파이썬 6")
print("파이썬 7")
print("파이썬 8")
print("파이썬 9")
print("파이썬 10")
실행 결과
파이썬 1
파이썬 2
파이썬 3
파이썬 4
파이썬 5
파이썬 6
파이썬 7
파이썬 8
파이썬 9
파이썬 10
하지만 위의 예제와 같이 print() 함수의 호출이 몇 번 안 되면 모르겠지만 만약 이와 같은 함수의 호출이 1000번 또는 10000번 이상 수행되어야 한다면 해당 소스 코드의 길이는 굉장히 길어지게 되고 가독성 또한 매우 나빠지게 될 것입니다.
따라서 파이썬을 비롯한 대부분의 프로그래밍 언어에서는 반복해서 특정 명령이나 연산을 수행해야 할 경우 사용할 수 있도록 반복문이라는 것을 제공하고 있습니다. 반복문(iteration statements)이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어해 주는 명령문을 의미합니다.
while 문
파이썬에서 사용할 수 있는 가장 간단한 반복문은 while 문입니다.
while 문은 조건식이 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행합니다.
파이썬에서 while 문은 다음과 같은 방식으로 사용할 수 있습니다.
문법
while 조건식:
조건식의 결과가 참(True)인 동안 반복적으로 실행되는 명령문
다음은 while 문의 동작을 나타낸 흐름도입니다.
while 문을 만난 프로그램은 가장 먼저 조건식(①)의 결과가 참(True)인지를 검사합니다. 만약 조건식의 결과가 참(True)이라면 프로그램의 흐름은 while 문 내부로 진입하며, 만약 결과가 거짓(False)이라면 while 문에 진입하지 않고 건너뛰게 됩니다.
while 문 내부로 진입한 프로그램은 내부에 포함된 모든 명령문(②)을 실행하고 나서 또다시 조건식을 검사합니다. 이렇게 조건식을 검사하고 명령문을 모두 수행한 후 또다시 조건식을 검사하는 모양이 마치 고리와 같다고 하여 반복문을 루프(loop)라고도 부릅니다.
다음 예제는 앞서 살펴본 예제를 while 문을 사용하여 다시 구현한 예제입니다.
실행 결과
파이썬 1
파이썬 2
파이썬 3
파이썬 4
파이썬 5
파이썬 6
파이썬 7
파이썬 8
파이썬 9
파이썬 10
앞선 예제의 소스 코드가 총 10줄이었다면 while 문을 사용한 이번 예제는 단 4줄의 소스 코드로 동일한 결과를 보여주고 있습니다.
이처럼 반복문을 적절히 사용하면 소스 코드의 길이뿐만 아니라 코드의 가독성까지 좋게 만들 수 있습니다.
무한 루프(infinite loop)
while 문의 동작에서 가장 중요한 것이 바로 조건식의 결과를 변경하는 명령문(③)입니다.
while 문에 진입하기 위해서는 조건식(①)의 결과가 참(True)이어야 하는데, 이러한 조건식의 결과를 변경하는 명령문(③)이 while 문 내부에 존재하지 않는다면, 조건식의 결과는 언제나 참(True)으로 고정되므로 while 문은 영원히 반복될 것입니다.
이렇게 영원히 반복되는 반복문을 무한 루프(infinite loop)라고 부르며, 무한 루프에 빠진 프로그램은 영원히 종료되지 않습니다.
반복문을 작성할 때 가장 많이하는 실수가 바로 루프를 탈출하기 위한 명령문(③)을 실수로 작성하지 않거나 조건식을 원하는 대로 변경하는데 실패하는 경우입니다. 이처럼 의도치 않게 발생한 무한 루프는 해당 프로그램을 정상적인 방법으로는 끝낼 수 없게 만들며, 결국에는 해당 프로그램뿐만 아니라 프로그램을 돌리는 컴퓨터까지 멈추게 만들 수 있습니다. 따라서 while 문과 같은 반복문을 작성할 때는 조건식의 결과가 어느 순간에는 거짓(False)으로 변경되도록 반드시 탈출 조건(③)을 포함시켜야 합니다.
이처럼 무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황이지만, 프로그램을 만들다보면 상황에 따라 의도적으로 무한 루프를 사용하는 경우도 생깁니다. 파이썬에서는 무한 루프를 다음과 같이 의도적으로 만들 수 있으며, 이때는 탈출 조건에 더욱 신경 써야 합니다.
문법
while True:
반복적으로 실행하고자 하는 명령문
⁝
for 문
while 문은 구조상 while 문 내부에 조건식의 결과를 변경하는 명령문을 삽입해야하기 때문에 종종 실수를 하게 됩니다. 하지만 for 문은 이러한 조건식의 결과를 변경하는 명령문을 따로 사용하지 않고도 튜플이나 리스트, 문자열 등을 원하는 횟수만큼 반복할 수 있도록 해줍니다.
문법
for 변수 in 문자열(or 튜플 or 리스트):
반복적으로 실행하고자 하는 명령문
⁝
for 문을 만난 프로그램은 우선 in 키워드가 가리키는 문자열, 튜플 또는 리스트(①)의 첫 번째 요소를 꺼내 변수(②)에 대입합니다. 이렇게 대입된 변수는 for 문 내부의 명령문(③)에서 자유롭게 사용할 수 있습니다.
for 문 내부의 모든 명령문을 수행하고 나면 또다시 해당 문자열, 튜플 또는 리스트(①)로 돌아가 다음 요소가 있는지를 검사합니다. 만약 다음 요소가 존재한다면 해당 요소를 변수에 대입하고 또다시 루프를 실행하며, 만약 다음 요소가 존재하지 않는다면 for 문은 종료됩니다.
이처럼 for 문은 대상이 되는 문자열, 튜플 또는 리스트의 길이만큼만 손쉽게 반복문을 수행할 수 있습니다.
다음 예제는 해당 문자열의 모든 문자를 하나씩 출력하는 예제입니다.
실행 결과
파
이
썬
프
로
그
래
밍
range() 함수
파이썬에서 for 문과 함께 가장 많이 사용되는 함수는 바로 range() 함수일 것입니다.
range() 함수는 전달된 인수에 따라 연속된 정수들을 반환하는 함수로, 전달되는 인수의 수에 따라 다음과 같이 두 가지 방식으로 사용할 수 있습니다.
문법
1. range(마지막정수)
2. range(시작정수, 마지막정수)
첫 번째 방식처럼 인수가 하나만 전달될 경우에는 0부터 (마지막정수-1)까지 1씩 증가하는 연속된 정수들을 반환합니다.
이때 전달되는 인수가 음의 정수이면 아무런 정수도 반환하지 않습니다.
예제
range(5) → 0, 1, 2, 3, 4
range(10) → 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
range(-3) →
만약 두 번째 방식처럼 인수가 두개 전달될 경우에는 시작정수부터 (마지막정수-1)까지 1씩 증가하는 연속된 정수들을 반환합니다.
예제
range(2, 5) → 2, 3, 4
range(-3, 5) → -3, -2, -1, 0, 1, 2, 3, 4
range(-7, -2) → -7, -6, -5, -4, -3
다음 예제는 for 문과 range() 함수를 사용하여 구구단을 출력하는 예제입니다.
예제
for col in range(2, 10):
for row in range(1, 10):
print (col, " x ", row, " = ", col * row)
실행 결과
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
⁝
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
위의 예제처럼 for 문 안에 또 다른 for 문을 중첩하여 사용함으로써 문제를 간결하게 표현할 수 있습니다.
하지만 for 문의 무리한 중첩 사용은 프로그램의 실행 속도에 큰 영향을 줄 수 있으므로, 사용할 때 세심한 주의가 필요합니다.