함께 배우는 수업 · 컴퓨터/정보

제어문과 반복 루프

프로그램의 실행 흐름을 분기하는 조건문(if-elif-else), 단락 평가(Short-circuit Evaluation), 반복 루프(for/while) 제어(break/continue) 및 리스트 컴프리헨션을 학습합니다.

이 수업에서 해 볼 일

  • 조건 분기와 반복 횟수를 추적하여 출력값을 구한다

먼저 알면 좋은 것: 불리언(Boolean: True/False) 논리 연산자(and, or, not) · 비교 연산자(==, !=, <, <=, >, >=)와 변수 대입(=) · 리스트(list)와 시퀀스(Sequence) 인덱싱/슬라이싱

오늘의 목표

가입 없이 시작할 수 있어요. 설명을 읽고, 함께 연습한 뒤, 처음 보는 문제에서 직접 확인합니다.

판단 과정과 비교 사례

조건문은 어떤 줄이 실행될지, 반복문은 그 줄이 몇 번 실행될지를 결정한다. 반복마다 조건 검사와 변수 갱신을 따로 적으면 실행 경로를 추적하기 쉽다.range(2,5)는 2,3,4를 만든다. 이 중 홀수만 합치면 3이다. 범위의 끝값 포함 여부와 본문 안의 조건을 각각 확인해야 한다.break는 반복 전체를 끝내고 continue는 이번 반복의 남은 부분만 건너뛴다. and의 단락 평가는 왼쪽 조건이 거짓이면 오른쪽 식을 평가하지 않는다.

1. 조건 분기문(if-elif-else)과 논리 연산의 단락 평가(Short-Circuit)

- 조건문 (Conditional Statement): 주어진 조건식의 평가 결과(참 True 또는 거짓 False)에 따라 실행할 코드 블록을 결정합니다. - 파이썬에서는 숫자 0, 빈 문자열 "", 빈 리스트 [], None은 조건식에서 자동으로 거짓(Falsy)으로 평가되고, 그 외의 값이 있는 객체는 참(Truthy)으로 평가됩니다. - 단락 평가 (Short-Circuit Evaluation): - 논리 연산자 and(&&)와 or(||)는 왼쪽 식만으로 전체 결과가 확정되면 오른쪽 식은 아예 실행(평가)조차 하지 않고 건너뛰는 최적화 규칙입니다. - A and B: A가 거짓(False)이면 전체가 무조건 거짓이므로 B를 실행하지 않음. (예: if idx < len(arr) and arr[idx] == 5:에서 인덱스 범위 검사를 앞에 두어야 IndexError를 예방할 수 있습니다!) - A or B: A가 참(True)이면 전체가 무조건 참이므로 B를 실행하지 않음.단락 평가(Short-Circuit)를 활용한 실무 방어 코딩: 배열 조회나 나눗셈을 할 때 항상 if x != 0 and (100 / x) > 5: 또는 if user is not None and user.is_active:처럼 안전한 가드(Guard) 조건을 왼쪽에 배치해야 런타임 에러(ZeroDivisionError, NullPointerException)를 막을 수 있습니다.

2. 반복문(for vs while)과 루프 제어(break, continue)

1. for 루프 (횟수/시퀀스 기반 반복): - 리스트, 문자열, range(start, stop, step) 등 순회 가능한 객체(Iterable)에서 원소를 처음부터 끝까지 하나씩 꺼내며 정해진 횟수만큼 안전하게 반복합니다. - 주의: range(1, 5)는 시작값 1은 포함하고 끝값 5는 포함하지 않는 반열린 구간 [1,5)[1, 5)이므로 1, 2, 3, 4 총 4번 실행됩니다. 2. while 루프 (조건 기반 반복): - 조건식이 True인 동안 코드 블록을 계속 반복합니다. 반복 횟수를 미리 알 수 없을 때(예: 이진 탐색에서 while low <= high:, 사용자 종료 입력 대기) 유용하지만, 루프 내부에서 조건 변수를 갱신하지 않으면 무한 루프(Infinite Loop)에 빠집니다. 3. 흐름 제어 키워드: - break: 현재 감싸고 있는 가장 가까운 반복 루프를 즉시 완전히 탈출합니다. - continue: 현재 반복 회차의 아래쪽 남은 코드만 건너뛰고, 루프의 다음 반복 회차(조건 검사 또는 다음 원소)로 즉시 이동합니다.

예제로 살펴보기

다음 파이썬 코드가 실행되었을 때 최종적으로 변수 total에 저장되는 값과 루프 내부에서 더해지는 숫자들을 순서대로 구하시오.
total = 0
for n in range(1, 10):
    if n % 2 == 0:
        continue
    if n > 6:
        break
    total += n
  1. 1) range(1, 10)은 n = 1부터 9까지 순회합니다. 2) 첫 번째 조건 if n % 2 == 0: continue에 의해 짝수(2, 4, 6, 8)는 모두 건너뛰고 홀수만 아래로 내려갑니다. 3) 홀수 진행 추적: - n = 1: total = 0 + 1 = 1 - n = 3: total = 1 + 3 = 4 - n = 5: total = 4 + 5 = 9 - n = 7: 두 번째 조건 if n > 6: break가 참이 되어 7을 더하기 전에 반복문이 즉시 완전 종료됩니다! 4) 따라서 더해지는 숫자는 1, 3, 5이며 최종 total 값은 9입니다.
확인: 논리 연산의 단락 평가(Short-Circuit)에 의해 A and B에서 A가 거짓이면 B는 아예 실행되지 않는다.

3. 파이썬다운 코딩(Pythonic): 리스트 컴프리헨션과 enumerate/zip

- 리스트 컴프리헨션 (List Comprehension): - 새로운 리스트를 만들 때 여러 줄의 for문과 append() 호출 대신, 대괄호 안에 선언적 수식으로 한 줄에 작성하는 문법입니다:
‘[표현식 for 변수 in 시퀀스 if 조건식]‘\text{`[표현식 for 변수 in 시퀀스 if 조건식]`}
- 예: 1부터 10까지 중 홀수의 제곱 리스트 ➔ [x**2 for x in range(1, 11) if x % 2 == 1] ➔ [1, 9, 25, 49, 81]. - 내부적으로 C언어 레벨에서 최적화되어 실행되므로 일반 for 루프에서 .append()를 반복 호출하는 것보다 가독성이 높고 실행 속도도 약 1.5~2배 빠릅니다. - 필수 내장 이터레이터 함수: - enumerate(iterable): 인덱스와 원소 값을 튜플 (idx, val)로 동시에 꺼내어 range(len(arr)) 패턴을 대체합니다. - zip(listA, listB): 두 개 이상의 시퀀스를 나란히 묶어 같은 위치의 원소 쌍을 동시에 순회합니다.
2차원 배열 초기화 함정: matrix = [[0] * M] * N처럼 바깥쪽 리스트에 곱셈 연산자(* N)를 쓰면 똑같은 행 리스트의 참조 주소가 N번 복사되어, matrix[0][0] = 1만 바꿔도 모든 행의 첫 번째 열이 전부 1로 바뀌는 대형 버그가 발생합니다! 반드시 리스트 컴프리헨션 [[0] * M for _ in range(N)]으로 생성하세요.

참고 근거와 확인 범위

설명·예제·문제 구성 및 오류 수정 책임: 프리런. 위 자료는 표시한 주제를 확인하거나 더 읽기 위한 근거이며, 외부 기관의 공식 수업이나 감수본을 뜻하지 않습니다.

참고 자료 연결 점검: 2026-11-02. 제작 방식·검수 범위와 수정 기록에서 확인 범위를 볼 수 있습니다. 오류는 상단의 의견 보내기 또는 contact@freelearn.io로 알려 주세요.

이 단원의 개념서 읽기 →