Python

제어문 - 조건문

gudwns5533 2026. 5. 27. 00:49

파이썬의 조건문은 프로그램의 실행 흐름을 제어하기 위한 문법으로, 기본적으로 if, elif, else를 사용하여 조건의 참(True)과 거짓(False)에 따라 다른 코드를 실행할 수 있다. 간단한 조건에 대해서는 "값1 if 조건 else 값2" 형태의 조건부 표현식을 사용해 한 줄로 값을 선택할 수 있다. 

 

1. if, elif, else

1. if 문

가장 기본적인 조건문. 특정 조건이 참(True)일 경우에만 해당 블록 내의 코드가 실행된다.

if 조건:
    실행할 코드

 

여기에서 조건은 True 또는 False로 평가될 수 있는 표현식이어야 한다. 조건이 True로 평가되면 if 문 바로 아래의 코드 블록이 실행된다. 조건이 False로 평가되면 그 코드 블록은 건너뛰고 if문 밖으로 나온다.

age = int(input('나이를 입력하세요: '))

if age > 19:
    print('성인입니다')
    print('넷플릭스 성인영화를 감상할 수 있습니다')
print('입력한 나이: ', age)

 

2. else 문

else 문은 조건문에서 특정 조건이 충족되지 않을 때 실행할 코드 블록을 정의할 때 사용.

if 조건:
    코드 블록1
else:
    코드 블록2
age = int(input('나이를 입력하세요'))

if age > 19:
    print('성인입니다')
    print('넷플릭스 성인영화를 감상할 수 있어요')
else:
    print('미성년입니다')
    print('디즈니플러스를 보세요')
print('입력한 나이: ', age)
text = input("아이디를 입력하세요: ")

if (length := len(text)) < 3:
    print(f"아이디가 너무 짧습니다. (입력한 글자 수: {length})")
else:
    print(f"아이디 '{text}'는 사용 가능합니다.")

 

※ 왈라스 연산자 (:=)

:= 연산자는 파이썬에서 값을 할당하면서 동시에 그 값을 표현식 안에서 사용할 수 있게 해주는 할당 표현식(assignment expression)이다. 기존에는 값을 변수에 저장한 뒤 다시 사용하는 두 단계 과정이 필요하지만, :=를 사용하면 조건문, 반복문, 컴프리헨션 등에서 값을 한 번 계산하면서 변수에 저장하고 바로 활용할 수 있어 코드가 더 간결해진다.

 

3. elif문

elif if-else 구조에서 추가적인 조건을 검사하기 위해 사용합니다. elif는 "else if"의 줄임말이며, 주어진 여러 조건 중에서 하나만 참일 때 실행되는 코드 블록을 정의한다.

  • elif는 if 없이 단독으로 사용될 수 없다.
  • elif는 필요에 따라 여러 번 사용될 수 있다.
  • else는 선택적이다. 사용될 경우, 항상 if나 elif 뒤에 나타나야 한다.
if 조건1:
    코드 블록1
elif 조건2:
    코드 블록2
elif 조건3:
    코드 블록3
else:
    코드 블록4
age = int(input('나이를 입력하세요: '))

if age > 19:
    print('성인입니다')
elif age > 14:
    print('청소년입니다')
elif age > 6:
    print('어린이입니다')
elif age > 0:
    print('유아입니다')
else:
    print('입력을 확인하세요')

print('입력한 나이: ', age)
print("오늘 저녁 뭐 먹지?")

# 첫 번째 질문: 한식 vs 양식/일식
answer1 = input("Q1. 오늘 뜨끈한 밥이나 국물이 있는 '한식'이 당기시나요? (y/n): ")

if answer1.lower() == 'y':
    # 한식으로 진행
    print("[한식 메뉴 분석 중...]")
    answer2 = input("Q2. 매콤하거나 얼큰한 음식을 좋아하시나요? (y/n): ")
    
    if answer2.lower() == 'y':
        # 한식 + 매운맛
        answer3 = input("Q3. 고기가 들어간 음식을 원하시나요? (y/n): ")
        if answer3.lower() == 'y':
            print("추천 메뉴: 제육볶음이나 닭볶음탕을 드셔보세요!")
        else:
            print("추천 메뉴: 순두부찌개나 떡볶이를 추천합니다!")
    else:
        # 한식 + 안 매운맛
        answer3 = input("Q3. 국물이 있는 요리를 원하시나요? (y/n): ")
        if answer3.lower() == 'y':
            print("추천 메뉴: 갈비탕이나 설렁탕을 추천합니다")
        else:
            print("추천 메뉴: 비빔밥이나 불고기를 드셔보세요!")

else:
    # 한식 외(양식/일식/중식 등)로 진행
    print("[한식 외 메뉴 분석 중...]")
    answer2 = input("Q2. 면 요리(누들)를 좋아하시나요? (y/n): ")
    
    if answer2.lower() == 'y':
        # 외식 + 면 요리
        answer3 = input("Q3. 국물이 있는 따뜻한 면을 원하시나요? (y/n): ")
        if answer3.lower() == 'y':
            print("추천 메뉴: 일본식 라멘이나 쌀국수를 추천합니다!")
        else:
            print("추천 메뉴: 크림 파스타나 짬뽕을 추천합니다!")
    else:
        # 외식 + 밥/빵/기타
        answer3 = input("Q3. 오늘 탄수화물이 당기시나요? (y/n): ")
        if answer3.lower() == 'y':
            print("추천 메뉴: 피자나 수제버거는 어떠신가요?")
        else:
            print("추천 메뉴: 일식 돈카츠나 초밥을 드셔보세요!")

print("맛있게 드시고 행복한 저녁 보내세요!")

2. if 여러 개 쓰기 VS if ~ elif ~ else 쓰기

1. if ~ elif ~ else

score = 85

if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("F")

 

👉 조건을 위에서부터 검사하다가
👉 처음 True가 나오면 그 이후는 전부 무시

 

2. if를 여러 번 쓰는 경우

score = 85

if score >= 90:
    print("A")
if score >= 80:
    print("B")
if score >= 70:
    print("C")

 

👉 각각 독립적으로 검사됨
👉 여러 개가 동시에 실행될 수 있음

3. 조건부 표현식(Conditional Expression)

조건부 표현식(Conditional Expression)은 조건의 참(True)과 거짓(False)에 따라 값을 선택하는 한 줄짜리 조건문으로, 간단한 분기 로직을 간결하게 표현할 때 유용하다. 다만 조건이 복잡하거나 여러 줄의 처리가 필요한 경우에는 일반적인 if문을 사용하는 것이 가독성 측면에서 더 적절하다.

조건이 참인 경우 값 if 조건 else 조건이 거짓인 경우 값
# if~else로 작성
num = int(input('숫자를 입력하세요: '))
if num % 2 == 0:
    print('짝수')
else:
    print('홀수')

# 조건부 표현식으로 작성
num = int(input('숫자를 입력하세요: '))
print('짝수') if num % 2 == 0 else print('홀수')

4. 구조적 패턴 매칭

Python 3.10 버전부터 도입된 도입된 구조적 패턴 매칭이다. match ~ case 구문은 "이 데이터의 '모양(구조)'과 '내용'이 내가 원하는 조건과 딱 맞아떨어지는가?를 검사한다고 생각하면 된다. Java/C의 switch-case와 비슷하지만 훨씬 더 강력한 기능을 가진다.

match 값:
    case 패턴1:
        실행할 코드1
    case 패턴2:
        실행할 코드2
    case _:                        # _는 else와 비슷한 역할
        기본 실행 코드 (default)

 

- 파이프(|)연산자로 묶기

# 1~5세는 유아, 6~12세는 초등학생 이런 식으로 특정 값들을 매칭
age = int(input("나이를 입력하세요: "))

match age:
    case 1 | 2 | 3 | 4 | 5 | 6 | 7:
        print("미취학 아동입니다. 보호자 동반 시 무료 입장 가능합니다. 👶")
    case 8 | 9 | 10 | 11 | 12 | 13:
        print("초등학생입니다. 어린이 요금이 적용됩니다. 🎒")
    case 14 | 15 | 16 | 17 | 18 | 19:
        print("청소년입니다. 청소년 요금이 적용됩니다. 🧑‍🎓")
    case _:
        # 위의 나이에 해당하지 않는 20세 이상 성인이나 기타 예외 처리
        if age > 19:
            print("성인입니다. 일반 요금이 적용됩니다. 🧑")
        else:
            print("잘못된 나이 입력입니다.")

 

- 시퀀스 패턴 과 매핑 패턴

# 예시 A: 딕셔너리 데이터 (매핑 패턴)
data = {"type": "login", "id": "python_user", "status": "success"}

# 예시 B: 3개짜리 리스트 데이터 (시퀀스 패턴)
# data = ["logout", "python_user", "2026-05-27"]

# 예시 C: 2개짜리 튜플 데이터 (시퀀스 패턴 - 다른 구조)
# data = ("error", "404_Not_Found")


match data:
    # 1. 매핑 패턴: 딕셔너리이면서 특정 키들이 다 있는가?
    case {"type": "login", "id": user_id, "status": login_status}:
        print(f"🔑 로그인 알림 -> 아이디: {user_id}, 결과: {login_status}")
        
    # 2. 시퀀스 패턴 (리스트): 방이 3개이고 첫 번째 값이 "logout"인가?
    case ["logout", user_id, logout_time]:
        print(f"🚪 로그아웃 알림 -> 아이디: {user_id}님이 {logout_time}에 로그아웃했습니다.")
        
    # 3. 시퀀스 패턴 (튜플): 방이 2개이고 첫 번째 값이 "error"인가?
    case ("error", error_message):
        print(f"🚨 에러 발생 -> 내용: {error_message}")
        
    # 4. 아무것도 매칭되지 않는 나머지 경우
    case _:
        print("알 수 없는 형태의 데이터 포맷입니다.")

 

# 예시 1: 딕셔너리로 들어온 주소 데이터
address_data = {"city": "서울시", "district": "강남구", "detail": "테헤란로"}

# 예시 2: 리스트로 들어온 주소 데이터
# address_data = ["경기도", "수원시", "영통구"]

# 예시 3: 한 줄 문자열로 들어온 주소 데이터
# address_data = "부산시 해운대구 우동"


match address_data:
    # 1. 타입이 dict() 이면서 내부 구조가 일치할 때
    case dict({"city": c, "district": d, "detail": det}):
        print(f"🏠 [딕셔너리 분석] 배송지: {c} {d} (상세주소: {det})")

    # 2. 타입이 list() 이면서 내부 구조가 일치할 때
    case list([c, d, det]):
        print(f"🚛 [리스트 분석] 배송지: {c} {d} {det}")

    # 3. 타입이 str(문자열) 자체일 때 (구조 분해가 필요 없는 기본 타입)
    case str() as full_address:
        print(f"✉️ [문자열 분석] 배송지 구문 전체: {full_address}")

    # 4. 아무것도 매칭되지 않는 예외 상황
    case _:
        print("❌ 지원하지 않는 주소 데이터 형식입니다.")

'Python' 카테고리의 다른 글

이터러블(Iterable)과 이터레이터(Iterator)  (0) 2026.05.27
제어문 - 반복문  (0) 2026.05.27
컬렉션 타입 (딕셔너리)  (0) 2026.05.26
컬렉션 타입 (세트)  (0) 2026.05.26
컬렉션 타입 (튜플)  (0) 2026.05.26