파이썬 기초 - 3장 프로그램의 구조를 쌓는다! 제어문 | 2023 점프 투 파이썬
안녕하세요! 👨🏫 오늘은 '점프 투 파이썬' 강의의 세 번째 시간, **'제어문(Control Flow)'**에 대해 깊이 있는 이야기를 나눠볼까 합니다. 프로그래밍을 마치 교통 신호 체계에 비유한다면, 제어문은 신호등, 표지판, 그리고 네비게이션과 같아요. 🚦🚗 이들이 없다면 차들은 어디로 가야 할지 모르고 정해진 길로만 갈 수밖에 없겠죠. 마찬가지로, 제어문이 없다면 컴퓨터는 정해진 순서대로만 명령을 실행하는 단순한 기계일 뿐입니다.
제어문은 프로그램에게 '생각하고', '판단하고', '반복하는' 능력을 부여합니다. 덕분에 우리는 단순한 계산기를 넘어, 사용자의 입력에 따라 다르게 반응하고, 수많은 데이터를 자동으로 처리하는 복잡한 프로그램을 만들 수 있게 됩니다. 이 글을 통해 프로그램의 흐름을 자유자재로 제어하는 제어문의 핵심 개념들을 마치 숙련된 도시 계획가처럼 꼼꼼하게 분석해 드릴게요. 복잡한 문제를 효율적으로 해결하는 힘을 얻고, 여러분의 아이디어를 현실로 구현하는 데 한 발짝 더 다가서게 될 것입니다. ✨
제어문이란 무엇인가? 🤔
**제어문(Control Flow Statement)**이란 프로그램의 실행 흐름을 제어하는 문법을 통칭하는 말입니다. 인간의 사고방식을 코드로 옮겨놓은 것이라고 생각하면 쉽습니다. 예를 들어, 우리가 "만약 돈이 있으면 택시를 타고, 돈이 없으면 걸어갈 거야"라고 생각하거나, "이 일을 ~하는 동안 반복할 거야"라고 계획하는 것을 코드로 옮겨놓은 것이죠. 제어문에는 크게 두 가지 종류가 있습니다.
- 조건문 (Conditional Statement): 특정 조건에 따라 다른 코드를 실행하게 합니다.
- 반복문 (Loop Statement): 특정 코드를 여러 번 반복해서 실행하게 합니다.
이 두 가지 제어문 덕분에 우리는 컴퓨터에게 복잡하고 다양한 지시를 내릴 수 있게 됩니다. 이제 각 제어문의 세계로 깊이 들어가 볼까요?
조건문: 논리적인 의사결정 도구 🧠
조건문은 **if**라는 키워드를 사용하여 만듭니다. '만약 ~라면'이라는 뜻처럼, 특정 조건이 **참(True)**일 때만 특정 코드를 실행하도록 지시하죠. 조건문은 프로그램의 가장 기본적인 논리 회로를 구축하는 역할을 합니다.
if 문의 기본 구조
if 문은 콜론(:)과 **들여쓰기(Indentation)**로 그 범위를 구분합니다. 파이썬에서는 들여쓰기가 단순한 시각적 효과가 아니라, 코드가 속한 블록을 구분하는 필수적인 문법 요소입니다. 한 칸이라도 들여쓰기가 틀리면 IndentationError라는 오류가 발생하므로 주의해야 합니다. 💥
if 조건:
# 조건이 참일 때 실행할 코드
# 들여쓰기된 코드 블록
else와 elif: 다양한 경우의 수 다루기
만약 조건이 거짓일 때도 특정 코드를 실행하고 싶다면 **else**를 사용합니다. else는 if 조건이 거짓일 때만 실행됩니다.
if 조건:
# 조건이 참일 때 실행
else:
# 조건이 거짓일 때 실행
그리고 여러 개의 조건을 순차적으로 판단해야 할 때는 **elif**를 사용합니다. elif는 else if의 줄임말로, 앞선 조건이 거짓일 때 다음 조건을 판단합니다. 이 구조는 여러 개의 분기점을 만들 때 매우 유용합니다.
if 조건1:
# 조건1이 참일 때 실행
elif 조건2:
# 조건1이 거짓이고 조건2가 참일 때 실행
elif 조건3:
# 조건1, 2가 거짓이고 조건3이 참일 때 실행
else:
# 모든 조건이 거짓일 때 실행
이러한 구조 덕분에 우리는 마치 순서도(Flowchart)를 그리듯 논리적인 흐름을 만들어낼 수 있습니다.
예를 들어, 사용자의 점수에 따라 학점을 매기는 프로그램을 생각해 보세요.
score = 85
if score >= 90:
print("학점은 A입니다.")
elif score >= 80:
print("학점은 B입니다.")
elif score >= 70:
print("학점은 C입니다.")
else:
print("학점은 F입니다.")
위 코드는 score가 85이므로 두 번째 elif 조건(score >= 80)이 참이 되어 "학점은 B입니다."를 출력합니다.
조건을 만드는 다양한 방법
조건문에서 가장 중요한 것은 바로 조건식입니다. 참과 거짓을 판별할 수 있는 모든 표현식이 조건식이 될 수 있습니다.
- 비교 연산자: 두 값을 비교하는 연산자입니다.
- == (같다), != (같지 않다)
- > (크다), < (작다)
- >= (크거나 같다), <= (작거나 같다)
- 논리 연산자: 여러 조건을 조합할 때 사용합니다.
- and: 두 조건이 모두 참일 때만 참.
- or: 두 조건 중 하나라도 참이면 참.
- not: 조건을 반대로 바꿈. (참을 거짓으로, 거짓을 참으로)
- in과 not in: 특정 값이 리스트, 튜플, 문자열 등에 포함되어 있는지 확인합니다.
- 'a' in 'apple'은 참(True)입니다.
- 3 not in [1, 2, 4]는 참(True)입니다.
- pass 키워드: if 문이나 함수, 클래스 등을 정의해야 하지만, 당장 실행할 내용이 없을 때 사용합니다. 빈 코드를 그대로 두면 오류가 발생하므로, **pass**를 사용하여 "일단 아무것도 하지 말고 지나가라"고 알려주는 거죠. 🚶♂️
반복문: 효율적인 작업 도구 🔁
반복문은 똑같은 작업을 여러 번 반복할 때 사용합니다. 코드를 반복해서 쓰지 않아도 되므로, 코드의 양을 줄이고 유지보수를 쉽게 해줍니다. 반복문에는 while 문과 for 문이 있습니다.
while 문: 조건이 참인 동안 반복
while 문은 특정 조건이 참인 동안 들여쓰기된 코드를 계속해서 반복합니다. 마치 "냄비의 물이 끓는 동안 계속 지켜봐라"는 명령과 같습니다.
while 조건:
# 조건이 참일 때 반복할 코드
주의사항: while 문을 사용할 때는 반드시 반복문을 종료시킬 조건을 만들어주어야 합니다. 그렇지 않으면 무한 루프에 빠져 프로그램이 멈추거나 컴퓨터에 과부하가 걸릴 수 있습니다. 😵💫
tree_count = 0
while tree_count < 5:
print(f"나무를 {tree_count+1}번 찍었습니다.")
tree_count = tree_count + 1
print("나무가 넘어갑니다.")
위 예시에서는 tree_count 변수를 하나씩 증가시켜 5가 되는 순간 while 조건이 거짓이 되어 반복문이 종료됩니다.
for 문: 정해진 횟수만큼 반복
for 문은 **자료형(리스트, 튜플, 문자열 등)**의 각 요소를 하나씩 꺼내어 반복합니다. 마치 "상자 안의 모든 물건을 하나씩 꺼내서 확인해라"는 명령과 같습니다. for 문은 while 문보다 반복 횟수가 명확하거나, 특정 컬렉션의 모든 요소를 순회해야 할 때 주로 사용됩니다.
for 변수 in 반복할_자료:
# 반복할 코드
리스트 순회:
fruits = ['사과', '바나나', '딸기']
for fruit in fruits:
print(f"저는 {fruit}를 좋아해요!")
문자열 순회:
word = "Python"
for char in word:
print(char)
딕셔너리 순회: 딕셔너리는 키, 값, 또는 키-값 쌍을 모두 순회할 수 있습니다.
info = {'name': '홍길동', 'age': 30, 'city': '서울'}
# 키만 순회
for key in info:
print(key)
# 값만 순회
for value in info.values():
print(value)
# 키와 값 동시 순회
for key, value in info.items():
print(f"{key}: {value}")
range 함수: 숫자 범위 반복
for 문과 찰떡궁합인 range() 함수는 특정 범위의 숫자를 생성해주는 파이썬 내장 함수입니다. range() 함수는 세 가지 형태로 사용됩니다.
range(stop): 0부터 stop-1까지의 숫자를 생성합니다.
for i in range(5): # 0, 1, 2, 3, 4
print(i)
range(start, stop): start부터 stop-1까지의 숫자를 생성합니다.
for i in range(1, 6): # 1, 2, 3, 4, 5
print(i)
range(start, stop, step): start부터 stop-1까지 step만큼 건너뛰며 숫자를 생성합니다.
for i in range(1, 10, 2): # 1, 3, 5, 7, 9
print(i)
for 문과 range를 조합하면 while 문처럼 정해진 횟수만큼 반복하는 작업을 매우 간결하게 처리할 수 있습니다.
이중 for 문: 복합적인 반복 작업
반복문 안에 또 다른 반복문을 넣는 것을 이중(Nested) 반복문이라고 합니다. 구구단을 출력하거나, 2차원 리스트를 순회하는 등 복합적인 반복 작업에 사용됩니다.
# 구구단 출력 예시
for i in range(2, 10): # 2단부터 9단까지
print(f"\n--- {i}단 ---")
for j in range(1, 10): # 1부터 9까지 곱하기
print(f"{i} * {j} = {i*j}")
이중 반복문은 바깥쪽 반복문이 한 번 실행될 때마다, 안쪽 반복문은 전체가 모두 실행되는 구조를 가집니다. 위 예시에서는 i가 2일 때 j는 1부터 9까지 모두 실행되고, 다시 i가 3으로 바뀌면 j는 또다시 1부터 9까지 모두 실행됩니다. 이 원리를 이해하는 것이 이중 반복문을 다루는 핵심입니다.
리스트 컴프리헨션: 한 줄의 마법 ✨
**리스트 컴프리헨션(List Comprehension)**은 for 문을 사용하여 리스트를 만드는 작업을 한 줄로 압축하는 파이썬의 매우 강력하고 '파이써닉(Pythonic)'한 기능입니다. 코드가 간결하고 읽기 쉬워지며, 실행 속도도 더 빠릅니다.
기본 구조
[결과 표현식 for 변수 in 반복 가능한 객체]
# 일반적인 for 문
result = []
for i in range(10):
result.append(i * 2)
print(result) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 리스트 컴프리헨션
result = [i * 2 for i in range(10)]
print(result) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
조건문 추가
리스트 컴프리헨션에 if 문을 추가하여 조건을 만족하는 요소만 포함할 수도 있습니다. [결과 표현식 for 변수 in 반복 가능한 객체 if 조건]
# 0부터 9까지의 숫자 중 짝수만 2배로 만들기
result = [i * 2 for i in range(10) if i % 2 == 0]
print(result) # [0, 4, 8, 12, 16]
이중 for 문 압축
더 나아가, 이중 for 문도 리스트 컴프리헨션으로 압축할 수 있습니다.
# 일반적인 이중 for 문
gugudan_result = []
for i in range(2, 10):
for j in range(1, 10):
gugudan_result.append(i * j)
# 리스트 컴프리헨션
gugudan_result = [i * j for i in range(2, 10) for j in range(1, 10)]
리스트 컴프리헨션은 처음에는 익숙하지 않을 수 있지만, 파이썬 개발자라면 반드시 익혀야 할 핵심 문법입니다.
반복 제어: break와 continue
break와 continue는 반복문의 흐름을 제어하는 특별한 키워드입니다. 반복문이 예상치 못한 상황을 만났을 때 유연하게 대처할 수 있도록 도와줍니다.
- break: 반복문을 강제로 즉시 종료하고 빠져나갑니다. 특정 조건을 만족하면 더 이상 반복할 필요가 없을 때 유용하게 사용됩니다.
- continue: 반복문의 현재 실행을 건너뛰고 다음 반복으로 넘어갑니다. 특정 조건을 만족하는 경우에만 특정 코드를 실행하지 않고 싶을 때 사용합니다.
# break 예시: 원하는 값 찾기
numbers = [1, 5, 8, 3, 9, 2]
target = 8
for num in numbers:
if num == target:
print(f"목표 값 {target}을(를) 찾았습니다.")
break # 목표를 찾았으니 더 이상 반복할 필요 없음
print(f"{num}은(는) 목표 값이 아닙니다.")
# continue 예시: 짝수만 출력하기
for i in range(10):
if i % 2 != 0: # i가 홀수이면
continue # 아래 코드를 실행하지 않고 다음 반복으로
print(f"{i}는 짝수입니다.")
break와 continue는 프로그램의 흐름을 더욱 세밀하게 제어할 수 있도록 도와주는 필수적인 도구입니다.
else 절의 또 다른 쓰임새 🧐
파이썬의 제어문에는 다른 언어에서는 보기 드문 독특한 특징이 있습니다. 바로 for나 while 반복문에 else 절을 붙일 수 있다는 점입니다.
- for-else 문: for 문이 break 없이 모든 반복을 정상적으로 완료했을 때만 else 절의 코드가 실행됩니다.
- while-else 문: while 문이 조건이 거짓이 되어 정상적으로 종료되었을 때만 else 절의 코드가 실행됩니다.
# for-else 예시: 모든 사람을 검사하고 특정 사람이 없음을 알림
members = ["철수", "영희", "민수"]
name_to_find = "길동"
for member in members:
if member == name_to_find:
print(f"{name_to_find}을(를) 찾았습니다.")
break
else:
print(f"{name_to_find}은(는) 명단에 없습니다.")
위 코드에서는 break가 실행되지 않았으므로 else 절의 코드가 실행됩니다. 이처럼 for-else는 '모든 요소를 다 확인하고 나서야 무언가를 실행하고 싶을 때' 유용하게 사용됩니다.
정리하며... ✍️
오늘은 파이썬의 핵심 제어문인 조건문과 반복문에 대해 심도 깊은 이야기를 나눠봤습니다. 조건문은 프로그램에게 논리적인 의사결정 능력을 부여하고, 반복문은 효율적인 반복 작업을 가능하게 합니다. 이 두 가지 제어문을 통해 우리는 단순한 계산기를 넘어, 사용자의 입력에 따라 다르게 반응하고 복잡한 작업을 자동으로 처리하는 프로그램을 만들 수 있습니다.
**if와 elif, else**로 프로그램의 논리적인 길을 만들고, **while과 for**로 그 길을 걷는 방법을 익히세요. 그리고 **break와 continue**로 예상치 못한 상황을 우아하게 처리하고, 리스트 컴프리헨션으로 코드를 더욱 간결하고 아름답게 만드는 능력까지 갖춘다면, 여러분은 이미 한 명의 훌륭한 파이썬 개발자입니다. 🚀 이제 여러분의 아이디어를 코드로 마음껏 펼쳐보세요!
'IT⦁영어⦁하자보수 > IT' 카테고리의 다른 글
| 7. 파이썬 기초 - 5장 파이썬 날개 달기 [조코딩] (1) | 2025.09.20 |
|---|---|
| 6. 파이썬 기초 - 4장 파이썬의 입출력 [조코딩] (0) | 2025.09.20 |
| 4. 파이썬 기초 - 2장 파이썬 프로그래밍의 기초, 자료형 (2) [조코딩] (0) | 2025.09.19 |
| 3. 파이썬 기초 - 2장 파이썬 프로그래밍의 기초, 자료형 (1) [조코딩] (0) | 2025.09.19 |
| 2. 파이썬 기초 - 1장 파이썬이란 무엇인가? [조코딩] (1) | 2025.09.19 |