파이썬 코딩을 시작하면 마치 설계도에 따라 위에서 아래로 벽돌을 하나씩 쌓듯, 코드가 순차적으로 실행되는 것을 볼 수 있습니다.
(이를 '동기식(Synchronous)' 또는 절차적 코드라고 부릅니다.)
하지만 현실 세계의 비즈니스 로직(게임, 웹 서비스, 데이터 크롤링 등)은 이렇게 단순한 직선 형태가 아닙니다.
"만약 사용자가 로그인했다면 메인 화면으로 가고, 아니라면 로그인 창을 띄워라" 또는
"데이터가 100개가 될 때까지 계속 수집해라"처럼 상황에 따라 흐름(Flow)을 점프하거나 반복해야 합니다.
이렇게 코드의 전개 흐름을 내 마음대로 컨트롤하는 문법을 '제어문(흐름 제어)'이라고 하며,
오늘은 이 제어문을 구동시키는 핵심 엔진인 '조건식과 연산자'에 대해 자세히 알아보겠습니다.

1. 파이썬 코드 블록(Code Block)과 스코프(Scope)의 이해
제어문을 본격적으로 배우기 전, 파이썬만의 독특하고 중요한 문법 구조를 반드시 짚고 넘어가야 합니다.
- 콜론(:)과 들여쓰기(Indentation): 파이썬에서 if, for, while 같은 제어문이나 함수(def), 클래스(class)를 선언할 때는 첫 줄 끝에 반드시 콜론(:)을 붙여야 합니다. 콜론 뒤에서 엔터를 치면 다음 줄부터 자동으로 들여쓰기(보통 스페이스바 4칸)가 적용되는데, 이렇게 들여쓰기로 묶인 구역을 '코드 블록(Code Block)'이라고 부릅니다.
- 스코프(Scope, 유효 범위): 이 코드 블록이 생성되면, 블록 내부에서 선언된 변수는 밖에서 함부로 접근할 수 없는 '지역 변수(Local Variable)'의 개념을 가지게 됩니다. 파이썬은 들여쓰기로 이 스코프를 엄격하게 구분합니다.
# 코드 블록과 스코프 예시
is_admin = True
if is_admin: # 콜론(:)으로 시작
# 여기서부터 들여쓰기가 적용된 코드 블록
message = "관리자 페이지에 오신 것을 환영합니다."
print(message) # 출력: 관리자 페이지에 오신 것을 환영합니다.
2. 조건식 (Conditional Expression) 이란?
조건식은 제어문(조건문, 반복문)이 작동하기 위한 '전제 조건'입니다.
- 조건문(if)은 이 조건식이 참(True)일 때만 실행됩니다.
- 반복문(while)은 조건식이 참인 동안 무한히 반복됩니다.
- 나아가 데이터 분석 라이브러리(NumPy, Pandas 등)에서 원하는 데이터만 쏙쏙 뽑아내는 '불리언 인덱싱(Boolean Indexing)'의 핵심 원리이기도 합니다.
결론: 조건식을 평가한 최종 결과는 무조건 True(참) 아니면 False(거짓) 둘 중 하나로 도출됩니다.
3. 연산자 완벽 정리 (비교 연산, 논리 연산, 기타)
조건식을 구성하는 다양한 연산자들을 알아봅시다.
1) 비교 연산자 (값 vs 값 비교)
수학 시간에 배웠던 기호들과 비슷하지만, 코딩에 맞게 약간 형태가 다릅니다.
a = 10
b = 11
print(a == b) # a와 b의 값이 일치하는가? -> False
print(a != b) # a와 b의 값이 일치하지 않는가? -> True
print(a > b) # a가 b보다 큰가? -> False
print(a < b) # a가 b보다 작은가? -> True
print(a >= b) # a가 b보다 크거나 같은가? -> False
print(a <= b) # a가 b보다 작거나 같은가? -> True
# not 연산자는 값을 부정합니다.
# 파이썬에서 0이 아닌 숫자(10)는 True로 취급되므로, not True가 되어 False를 반환합니다.
print(not a) # -> False
2) 논리 연산자 (조건식 vs 조건식 조합)
여러 개의 조건을 묶어서 판단할 때 사용합니다. 타 언어의 || (or), && (and) 기호와 같은 역할을 합니다.
- C1 or C2 (둘 중 하나라도 참이면 참)
- 단축 평가 (Short-circuit): 만약 C1이 True라면, 어차피 결과는 무조건 참이므로 파이썬은 C2를 아예 확인하지 않고 넘어가버립니다. (속도 향상!)
- C1 and C2 (둘 다 참이어야 참)
- 단축 평가: 만약 C1이 False라면, 결과는 무조건 거짓이므로 C2를 확인하지 않습니다.
- not C1
- 조건식의 결과를 완전히 반대로 뒤집습니다.
a = 10
b = 11
# 소괄호 '()'를 사용하여 조건식을 묶어주면 가독성이 좋아집니다.
print((a < b) or (a == b)) # True or False -> True 반환
# and 연산자 단축 평가 예시
# 앞의 (a == b)가 False이므로, 뒤의 (a < b)는 검사하지 않고 즉시 False를 반환합니다.
print((a == b) and (a < b)) # False and True -> False 반환
3) 기타 강력한 연산자 (is, in)
- A is B (객체 식별 연산자)
- == 연산자가 값(Value)만 똑같은지 비교한다면, is 연산자는 메모리 상에 존재하는 고유한 ID(주소)가 완전히 똑같은 동일 객체인지까지 깐깐하게 비교합니다.
- a in A (멤버십 연산자)
- A라는 리스트, 튜플, 문자열 등의 컬렉션 안에 a라는 멤버가 포함되어 있는지 찾아줍니다. 정말 자주 쓰입니다!
4. 실전! 비어있는 리스트 검사하기 (Pythonic Way)
마지막으로 파이썬다운(Pythonic) 코드 작성법을 보여주는 훌륭한 실습을 해보겠습니다.
"리스트 c에 데이터가 하나도 비어있다면 메세지를 출력하라"는 요구사항이 있습니다. 이를 구현하는 3가지 방법을 보겠습니다.
c = [] # 비어있는 리스트
# 1. 값이 같은지 직접 비교
if c == []:
print("멤버가 없다")
# 2. 길이를 재서 비교
if len(c) == 0:
print("멤버가 없다")
# 3. not 연산자 활용 (가장 권장되는 Pythonic 스타일 ⭐)
# 파이썬에서 빈 리스트([])는 조건식에서 False로 평가됩니다.
# 따라서 not False가 되어 True로 뒤집히면서 if문이 실행됩니다.
if not c:
print('멤버가 없다') # 출력: 멤버가 없다
💡 추가 지식: 왜 not c 방식을 가장 추천할까요? 실제로 주피터 노트북 환경 등에서 %%time 매직 명령어로 실행 속도를 측정해 보면, 파이썬 내부 구조상 not c가 단순히 상태만 확인하기 때문에 len(c) == 0 처럼 함수를 호출하여 길이를 재고 0과 비교하는 과정보다 연산 속도가 미세하게 더 빠릅니다. > 무엇보다 코드가 훨씬 간결해지므로 실무에서는 빈 객체(문자열, 리스트 등)를 검사할 때 if not 객체: 방식을 표준으로 사용합니다.
5. 조건문이란?
프로그램을 만들 때 기획서나 요구사항에 "~하(면)"이라는 텍스트가 있다면, 이는 100% 조건문을 사용해 분기 처리(Branching)를 해야 한다는 의미입니다.
💡 알아두면 좋은 키워드: pass 파이썬에서는 조건문의 형태(뼈대)만 먼저 잡아두고 실제 로직은 나중에 구현하고 싶을 때 pass 키워드를 사용합니다. 이를 통해 문법 에러(IndentationError) 없이 자리를 차지하게 만들 수 있습니다.
6. 조건문의 3가지 기본 패턴
상황(조건)의 개수에 따라 파이썬의 조건문은 크게 3가지 형태로 나뉩니다.
① 상황이 1개일 때 (if)
가장 단순한 형태입니다. 조건이 참(True)일 때만 코드가 실행되며, 거짓(False)이면 아무 일도 일어나지 않고 넘어갑니다.
if 조건식:
# 조건이 참일 때 수행할 코드
② 상황이 2개일 때 (이분법, if - else)
"합격 아니면 불합격", "짝수 아니면 홀수"처럼 둘 중 하나가 반드시 실행되어야 하는 상황에 사용합니다.
if 조건식:
# 조건이 참일 때 수행
else:
# 조건이 거짓일 때 수행 (else에는 조건식이 붙지 않습니다!)
③ 상황이 3개 이상일 때 (if - elif - else)
조건이 여러 개일 때 사용합니다. 위에서부터 순례하며 조건식을 체크하고, 하나라도 참이 나오면 해당 블록을 실행한 뒤 나머지 조건은 무시하고 전체 조건문을 빠져나옵니다.
7. [실습] POS 시스템 결제 로직 구현하기
조건문과 무한 루프(while True), 그리고 반복문 탈출(break)을 결합하여 실전과 유사한 간단한 결제 시스템을 만들어 보겠습니다.
# 고객의 초기 잔액
customer_money = 5000
# 무한 루프 시작 (POS 시스템처럼 항상 대기)
while True:
prompt = '\n주문 총액을 입력하세요 (종료하려면 0 입력): '
# 사용자 입력 받기 (문자열을 정수형 int로 변환)
coffee_price = int(input(prompt).strip())
# 1. 시스템 종료 조건 (가장 먼저 체크하여 탈출구 마련)
if coffee_price == 0:
print('결제 시스템을 종료합니다.')
break # 나를 감싸고 있는 가장 가까운 반복문(while)을 완전히 탈출합니다.
# 2. 환불/충전 처리 (음수 입력 시)
if coffee_price < 0:
customer_money -= coffee_price # 음수를 빼면 더해지는 효과
print(f'환불 처리 완료. 현재 잔액은 {customer_money}원 입니다.')
continue # 아래 결제 로직을 건너뛰고 다시 while문 처음으로 돌아갑니다.
# 3. 메인 결제 로직 (if - elif - else)
if coffee_price == customer_money:
customer_money = 0
print('결제 완료. 잔액이 0원입니다.')
elif coffee_price < customer_money:
customer_money -= coffee_price
print(f'결제 완료. 남은 잔액은 {customer_money}원 입니다.')
else:
# coffee_price > customer_money 인 경우
print(f'잔액이 {coffee_price - customer_money}원 부족합니다.')
8. 파이썬의 삼항 연산자 (조건부 표현식)
상황이 2개(if - else)이고, 그 결과로 '특정 변수에 값을 할당'하는 경우라면, 파이썬이 지원하는 삼항 연산자를 통해 코드를 한 줄로 매우 간결하게 줄일 수 있습니다.
(근데 제 개인적인 생각으로 파이썬 삼향연산자가 자바나 자바스크립트보다 복잡해 보이는 것은 기분 탓인가요? ㅎㅎ)
- 기본 문법: 변수 = [참일 때 값] if [조건식] else [거짓일 때 값]
customer_money = 5000
coffee_price = 6000
# [기존 방식] 4줄의 코드가 필요합니다.
if customer_money >= coffee_price:
msg = '구매가능'
else:
msg = '구매불가능'
print(msg) # 출력: 구매불가능
# [삼항 연산자 방식] 단 1줄로 동일한 결과를 만듭니다! ✨
msg1 = '구매가능' if customer_money >= coffee_price else '구매불가능'
print(msg1) # 출력: 구매불가능
⚠️ 주의 (전문가 팁): 과거 파이썬 커뮤니티에서는 변수 = 조건식 and 참일때값 or 거짓일때값 형태의 편법을 간혹 사용하기도 했습니다. 하지만 이 방식은 '참일 때 값' 자체가 파이썬에서 거짓으로 평가되는 값(예: 0, "", [])일 경우 오작동을 일으키는 치명적인 단점이 있습니다. 따라서 최신 파이썬 코딩에서는 직관적이고 안전한 A if 조건 else B 형태만 사용하는 것을 강력히 권장합니다.
오늘의 한 마디
최근 결혼한 친구와 친구의 와이프 분을 만나고 왔는데 뭐라그럴까 엄청 좋아보여서 부러웠다. 결혼 생활을 하는데 다툼이 아예 없는 부부는 없다고 하는데 그 문제를 해결해 나가는 과정도 재미?있을 것 같고, 그러한 다툼보다는 같이 붙어있어서 좋은 것이 많아진다면 그건 더할 나위 없는 아주 좋은 결과라고 생각된다.
여러분도 여러분 만의 결혼에 대한 기준이나 로망? 이런 것이 있나요?
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 반복문(break, continue, else, while) (0) | 2026.07.14 |
|---|---|
| Python - 반복문 (for) (0) | 2026.07.13 |
| Python - 튜플 Tuple (생성, 인덱싱, 슬라이싱, 분해) (0) | 2026.07.11 |
| Python - 딕셔너리 Dictionary (데이터 추가 및 수정, 인덱싱, get(), keys(), values(), items(), del, clear()) (0) | 2026.07.10 |
| Python - 문자열 포매팅 (%, format, f-string) (0) | 2026.07.08 |