프로그래밍웹 교과서
이 페이지의 목차
2단원 · 9차시

순차와 선택 — 갈라지는 흐름

순차 구조선택 구조조건문다중 선택중첩 조건

코드 예제: Python · C · 예상 50분

학습 목표

  • 순차 구조와 선택 구조의 차이를 설명한다.
  • 조건에 따라 다르게 동작하는 프로그램을 작성한다.

관련 성취기준

  • 프그02-04

    순차, 선택, 반복의 제어 구조를 이해하고, 문제 상황에 알맞은 제어 구조를 선택하여 이를 적용한 프로그램을 작성할 수 있다.

생각 열기 — 판단을 사람이 하고 있다

6차시 활동에서 체질량지수를 구했다. 그런데 그 값이 저체중인지 정상인지는 표를 보고 사람이 판단했다. 8차시에서 윤년 판별 조건식도 만들었지만 참·거짓을 찍어 보기만 했다.

순차 구조 — 지금까지 쓴 것

순차 구조(sequence) — 적힌 순서대로 위에서 아래로 한 번씩 실행되는 흐름는 적힌 대로 위에서 아래로 흐르는 것이다. 지금까지 쓴 모든 코드가 이것이었다.

1단원 7차시에서 그린 순서도로 보면 네모와 화살표만 있고 마름모가 없는 모양이다. 갈라지지 않으므로 어떤 값을 넣어도 지나가는 줄이 같다.

선택 구조 — 조건에 따라 갈라진다

선택 구조(selection) — 조건의 참·거짓에 따라 서로 다른 줄을 실행하는 흐름는 마름모가 들어간 흐름이다. 조건이 참일 때와 거짓일 때 서로 다른 줄을 실행한다.

조건문의 모양
하려는 일PythonC
참일 때만if 조건:if (조건) { }
참·거짓 둘로if / elseif / else
셋 이상으로if / elif / elseif / else if / else
범위 구분괄호와 콜론조건에 소괄호가 반드시 필요하고 몸통은 { }
들여쓰기문법이다. 어긋나면 실행 안 됨보기 좋게 하는 것. 문법은 { } 가 정한다

다중 선택 — 등급 나누기

Python점수를 등급으로 바꾸기
for 점수 in [95, 83, 71, 58]:
    if 점수 >= 90:
        등급 = "A"
    elif 점수 >= 80:
        등급 = "B"
    elif 점수 >= 70:
        등급 = "C"
    else:
        등급 = "D"
    print(점수, "->", 등급)
확인된 실행 결과
95 -> A
83 -> B
71 -> C
58 -> D
C점수를 등급으로 바꾸기확인된 출력
#include <stdio.h>

int main(void)
{
    int scores[] = {95, 83, 71, 58};

    for (int i = 0; i < 4; i++) {
        int s = scores[i];
        char grade;
        if (s >= 90)      grade = 'A';
        else if (s >= 80) grade = 'B';
        else if (s >= 70) grade = 'C';
        else              grade = 'D';
        printf("%d -> %c\n", s, grade);
    }
    return 0;
}
실행 결과
95 -> A
83 -> B
71 -> C
58 -> D

순서가 중요하다

83 은 >= 80 도 참이고 >= 70 도 참이다. 그런데 B가 나온다. elif 는 앞의 조건이 모두 거짓일 때만 검사하기 때문이다. 위에서부터 처음 맞는 것에서 멈춘다.

그래서 순서를 뒤집으면 틀린다.

if 점수 >= 70:      ← 95도 여기서 걸린다
    등급 = "C"
elif 점수 >= 80:    ← 여기까지 오지 않는다
    등급 = "B"

95점이 C가 된다. 큰 값부터 검사해야 한다.

경계값을 어디에 두는가

>= 90 과 > 90 중 무엇을 쓸지가 90점 한 명의 등급을 바꾼다. 3단원 7·8차시에서 되풀이해 다룬 그 문제다.

조건 89점 90점 91점
점수 >= 90 B A A
점수 > 90 B B A

요구 사항에 “90점 이상 A”라고 적혀 있으면 >= 다. 3단원 2차시에서 “판정할 수 있게 적는다”고 한 것이 이 자리에서 코드로 갈린다.

중첩 조건 — 조건 안의 조건

조건 안에 또 조건을 넣을 수 있다.

if 점수 >= 90:
    if 출석 >= 15:
        등급 = "A"
    else:
        등급 = "B"      ← 점수는 A인데 출석이 모자라 B
else:
    등급 = "C"

같은 판정을 and 로 적을 수도 있다.

if 점수 >= 90 and 출석 >= 15:
    등급 = "A"
elif 점수 >= 90:
    등급 = "B"
else:
    등급 = "C"

활동

실습

점수를 등급으로 바꾸는 프로그램

약 25분

1단계 — 경계값을 확인한다 (10분)

실행기의 [고치기]로 점수 목록을 바꿔 표를 채운다. 경계값을 반드시 넣는다 (3단원 7차시).

점수 예상 등급 실제 등급 같았나
100
90
89
80
79
70
69
0

2단계 — 순서를 뒤집어 본다 (5분)

조건 순서를 70 → 80 → 90 으로 뒤집고 실행한다.

  • 95점이 무슨 등급이 되는가?
  • 왜 그렇게 되는지 elif 의 성질로 설명한다.
  • 되돌려 놓는다.

3단계 — elif 를 if 로 바꿔 본다 (5분)

elif 를 모두 if 로 바꿔 실행한다.

점수 elif 일 때 if 일 때 왜 달라졌나
95 A
83 B

4단계 — 조건을 하나 더 붙인다 (5분)

출석 일수를 함께 보는 판정을 넣어 보자. 요구 사항은 이렇다.

90점 이상이고 출석이 15일 이상이면 A, 90점 이상인데 출석이 모자라면 B, 나머지는 지금 규칙대로.

  • 중첩으로 적어 본다.
  • 같은 판정을 and 로 적어 본다.
  • 두 코드를 짝과 바꿔 읽고 어느 쪽이 읽기 쉬운지 이야기해 본다.

개념 확인 문제

보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.

if / elif / else 에서 83점이 B가 되는 까닭은?프그02-04

조건 순서를 70 → 80 → 90 으로 뒤집으면 95점은?프그02-04

elif 를 모두 if 로 바꾸면 95점의 등급은?프그02-04

C에서 if 의 몸통이 한 줄이어도 { } 를 쓰는 것이 안전한 까닭은?프그02-04

요구 사항이 「90점 이상 A」 일 때 알맞은 조건은?프그02-04

더 알아보기

심화값에 따라 갈라지는 다른 문법

등급처럼 범위로 나눌 때는 if / elif 가 맞다. 그런데 “1번이면 이것, 2번이면 저것”처럼 정해진 값 하나하나로 갈라질 때는 다른 문법이 있다. C의 switch 문이다.

switch (선택) {
    case 1: printf("추가\n"); break;
    case 2: printf("삭제\n"); break;
    default: printf("잘못된 선택\n");
}

break 를 빠뜨리면 아래 case 로 그대로 흘러 내려가는 것이 이 문법의 유명한 함정이다. Python에는 오래 이 문법이 없었고 if / elif 로 적어 왔다. 12차시에서 메뉴를 만들 때 어느 쪽이 읽기 좋은지 견줘 볼 만하다.

심화조건을 뒤집어 일찍 빠져나오기

중첩이 깊어지는 것을 막는 방법이 있다. 조건을 뒤집어 아닌 경우를 먼저 처리하고 빠져나오는 것이다.

if 점수 < 0 or 점수 > 100:
    print("잘못된 점수")
else:
    ... 긴 처리 ...

이것을 이렇게 바꾼다.

if 점수 < 0 or 점수 > 100:
    print("잘못된 점수")
    끝낸다
... 긴 처리 ...   ← 들여쓰기가 한 단계 줄었다

잘못된 경우를 앞에서 걸러 내면 아래 코드는 “여기 오는 값은 옳다”고 믿고 쓸 수 있다. 6차시 「더 알아보기」의 “문지기”와 3단원 4차시의 “문 앞에서 막는다”가 같은 이야기다. 15차시에서 return 을 배우면 이 방법을 제대로 쓸 수 있다.

실무빠진 경우가 없는지 확인하는 습관

if / elif 를 여러 개 적었을 때 어느 조건에도 걸리지 않는 값이 있는지 봐야 한다. 위 등급 코드는 else 가 있어 모든 값이 어딘가에 든다. 그런데 else 를 빼고 elif 점수 >= 60: 까지만 적으면, 59점은 등급이 정해지지 않아 등급 변수가 아예 만들어지지 않는다. Python에서는 그 뒤 print(등급) 에서 NameError 가 난다.

else 를 습관적으로 붙이고 “여기 올 수 없다”고 생각되는 경우에도 무언가 적어 두는 것이 안전하다. 1단원 6차시에서 알고리즘의 모든 경우에 출구가 있어야 한다고 한 것과 같은 원칙이다.

이어지는 학습

이 차시를 이해하려면 다음을 먼저 알아야 한다.

  • 8차시의 비교·논리 연산자 — 프로그래밍 프그02-03

교과서에서 찾기

교과서해당 위치쪽수
성림출판(Python)프로그래밍의 기초 › 04 제어문126쪽
씨마스커뮤니케이션(Python)프로그래밍 기초 › 4 제어문120쪽
삼양미디어(Python)프로그래밍의 기초 › 03 제어 구조98쪽
삼양미디어(C)프로그래밍의 기초 › 03 제어 구조100쪽
씨마스(C)C 프로그래밍의 기초 › 4 제어문96쪽
웅보출판사(C)프로그래밍의 기초 › Chapter 04 제어문116쪽