파이썬 제어 흐름 이해: 조건 분기와 무한 루프 관리

프로그램의 실행 흐름 구성 요소

소프트웨어 개발은 개발자의 논리적 사고를 컴퓨터가 실행 가능한 명령어로 변환하는 과정입니다. 이때 프로그램이 어떻게 동작할지를 결정하는 가장 중요한 요소가 제어 흐름 (Control Flow) 입니다.

일반적으로 기본 흐름 구조는 크게 세 가지로 나뉩니다.

  • 순차 구조 (Sequence): 명령어가 작성된 순서대로 위에서 아래로 한 줄씩 실행됩니다.
  • 선택 구조 (Selection/Branch): 특정 조건에 따라 실행될 코드가 달라지는 방식입니다.
  • 반복 구조 (Iteration/Loop): 특정 작업이 완료될 때까지 동일한 코드 블록을 되풀이합니다.

이번에는 파이썬 문법을 사용하여 주로 사용되는 선택 구조와 반복 구조에 대해 상세히 분석해 봅니다.

조건 분기 처리 (Conditional Statements)

실생활에서 비가 오면 우산을 쓰고, 안 오면 모자를 쓰는 것과 같이 상황에 따라 행동을 변경해야 하는 경우가 많습니다. 프로그램에서도 이러한 논리 분기는 필수적입니다.

If 문법의 기본 구조

조건문이 성립되었을 때만 하위 블록이 실행되도록 지정하는 데 사용하는 키워드가 if입니다. 기본적인 작성은 다음과 같습니다.

# 현재 환경 상태를 확인함
check_status = True  

print("시스템 점검 시작")
if check_status:  
    print("상태가 정상적이므로 작업을 계속합니다")
    proceed_operation = True
print("다음 단계로 진행")

if 사용 시 주의할 점은 다음과 같습니다.

  • 조건식 뒤에는 반드시 콜론 (:) 이 필요하며, 다음 줄에 코드 블록이 이어져야 합니다.
  • 조건이 충족되면 들여쓴 상태 (Indentation) 의 코드만 실행됩니다.
  • 하나의 블록 내부에서는 들여쓰기 깊이가 일정하게 유지되어야 합니다.

자식 코드 블록 (Block) 의 의미

파이썬에서는 괄호 ({}) 가 아닌 들여쓰기를 통해 코드 범위를 정의합니다. 같은 들여쓰기를 가진 문장들은 하나의 논리적 그룹을 형성하며, 가장 왼쪽 정렬된 문장은 최상위 레벨에 속합니다. 통상적으로 4 개 공백을 기준이나 통합 개발 환경 (IDE) 에서는 탭 키가 설정되어 있는 경우가 많습니다.

앞선 예시에서 비가 와도 오지 않아도 if 문블록이 끝나면 최상위인 print("다음 단계로 진행") 는 항상 실행됩니다.

대체 경로: Else 와 Elif

조건이 거짓일 때 어떤 조치를 취해야 한다면 else 가 필요합니다. 만약 두 가지 이상의 조건을 계층적으로 검사해야 한다면 elif(else if) 를 사용합니다.

user_input = int(input("점수를 입력하세요: "))
grade_system = {
    "S": "최고 등급",
    "A": "우수 등급", 
    "B": "보통 등급",
    "C": "충분함",
    "F": "불합격"
}

if user_input >= 95:
    print(f"{grade_system['S']}: {user_input}점")
elif user_input >= 80:
    print(f"{grade_system['A']}: {user_input}점")
elif user_input >= 70:
    print(f"{grade_system['B']}: {user_input}점")
else:
    print(f"{grade_system['F']}")

실행 시 상단의 조건부터 순차적으로 검증되며, 첫 번째로 참이 된 조건에 대응하는 블록이 수행되고 그 이후의 분기는 건너뜁니다.

중첩된 조건문

복잡한 비즈니스 로직에서는 조건문 안에 또 다른 조건문을 넣는 중첩 구조를 사용합니다. 예를 들어 사용자 인증 시스템에서 권한 체크 전에 블랙리스트 여부를 먼저 조회해야 할 수 있습니다.

# 접근 제어 목록
restricted_ids = ["admin_blocked", "root_test"]
authorized_users = {"manager_jane": "pass_001", "dev_bob": "pass_002"}

login_id = input("ID 입력: ")
login_pwd = input("비밀번호 입력: ")

if login_id in restricted_ids:
    print("접근이 거부되었습니다.")
elif login_id in authorized_users:
    if authorized_users[login_id] == login_pwd:
        print("인증 성공: 환영합니다.")
    else:
        print("비밀번호 오류 발생")
else:
    print("등록되지 않은 계정입니다.")

반복 처리 (Looping)

동일한 로직을 여러 번 수행해야 할 때 반복문을 활용합니다. 파이썬의 while 구문은 주어진 조건이 참으로 평가되는 동안 코드를 계속해서 실행합니다.

While 루프 동작 원리

반복문 내부에서는 무한 루프를 방지하기 위해 조건을 만족하지 않게 만드는 변수 조작이 반드시 포함되어야 합니다.

counter = 0
limit = 5

print("카운트 다운 시작:")
while counter < limit:
    print(counter)
    # 카운터를 증가시켜 종료 조건을 충족시킴
    counter += 1 
print("완료")

흐름은 위쪽 조건부 연산자로 돌아갔다가 판단을 거칩니다.

루프 제어 명령어: Break 과 Continue

반복 과정을 강제 중단하거나 현재 단계만 넘기려면 특수 키워드를 사용합니다.

  • break: 현재 실행 중인 루프를 즉시 탈출하여 외부 코드로 이동합니다.
  • continue: 현재 반복 횟수의 나머지 부분을 생략하고 곧바로 다음 반복 조건의 검증으로 넘어갑니다.

예시로 특정 값이 나왔을 때 멈추거나, 짝수 번호만 출력하는 등의 처리를 할 수 있습니다.

index = 0
total_checks = 10

while index < total_checks:
    if index == 7:
        print(f"{index}번째에서 강제 종료")
        break
    
    if index % 2 != 0:
        index += 1  # 홀수는 스킵
        continue
        
    print(f"처리 항목: {index}")
    index += 1

실무 적용 사례

학습한 내용을 바탕으로 실제 서비스에서 발생할 수 있는 시나리오를 코드로 구현해 봅니다.

로그인 시도 제한 기능

보안을 위해 로그인 실패 횟수가 너무 많으면 계정을 잠그는 로직입니다.

account_db = {"user_a": "secret_1", "user_b": "secret_2"}
max_attempts = 3
current_failures = 0

while current_failures < max_attempts:
    name = input("사용자명: ")
    secret = input("비밀번호: ")
    
    if name in account_db and account_db[name] == secret:
        print("로그인 성공")
        break
    else:
        print("정보가 일치하지 않습니다")
        current_failures += 1

if current_failures >= max_attempts:
    print("시도 횟수 초과로 임시 정지됨")

게임 메커니즘: 나이 맞추기

정해진 값을 사용자가 추측하도록 유도하고, 힌트를 제공하는 게임입니다.

target_value = 25
guess_count = 0
limit_per_round = 3

while True:
    try:
        user_guess = int(input("나이 예측 (숫자): "))
        
        if user_guess == target_value:
            print("정답입니다!")
            exit()
        elif user_guess < target_value:
            print("너무 작습니다.")
        else:
            print("너무 큽니다.")
            
        guess_count += 1
        
        if guess_count >= limit_per_round:
            choice = input(f"{limit_per_round}번 시도했습니다. 재시작하시겠습니까? (y/n): ")
            if choice.lower() == 'y':
                guess_count = 0
            else:
                print("게임을 종료합니다.")
                break
    except ValueError:
        print("숫자만 입력 가능합니다.")

태그: python conditional-statements while-loops logic-control scripting-fundamentals

5월 27일 04:06에 게시됨