이 페이지의 목차
순차와 선택 — 갈라지는 흐름
코드 예제: Python · C · 예상 50분
학습 목표
- 순차 구조와 선택 구조의 차이를 설명한다.
- 조건에 따라 다르게 동작하는 프로그램을 작성한다.
관련 성취기준
- 프그02-04
순차, 선택, 반복의 제어 구조를 이해하고, 문제 상황에 알맞은 제어 구조를 선택하여 이를 적용한 프로그램을 작성할 수 있다.
생각 열기 — 판단을 사람이 하고 있다
6차시 활동에서 체질량지수를 구했다. 그런데 그 값이 저체중인지 정상인지는 표를 보고 사람이 판단했다. 8차시에서 윤년 판별 조건식도 만들었지만 참·거짓을 찍어 보기만 했다.
순차 구조 — 지금까지 쓴 것
순차 구조(sequence) — 적힌 순서대로 위에서 아래로 한 번씩 실행되는 흐름는 적힌 대로 위에서 아래로 흐르는 것이다. 지금까지 쓴 모든 코드가 이것이었다.
1단원 7차시에서 그린 순서도로 보면 네모와 화살표만 있고 마름모가 없는 모양이다. 갈라지지 않으므로 어떤 값을 넣어도 지나가는 줄이 같다.
선택 구조 — 조건에 따라 갈라진다
선택 구조(selection) — 조건의 참·거짓에 따라 서로 다른 줄을 실행하는 흐름는 마름모가 들어간 흐름이다. 조건이 참일 때와 거짓일 때 서로 다른 줄을 실행한다.
| 하려는 일 | Python | C |
|---|---|---|
| 참일 때만 | if 조건: | if (조건) { } |
| 참·거짓 둘로 | if / else | if / else |
| 셋 이상으로 | if / elif / else | if / else if / else |
| 범위 구분 | 괄호와 콜론 | 조건에 소괄호가 반드시 필요하고 몸통은 { } |
| 들여쓰기 | 문법이다. 어긋나면 실행 안 됨 | 보기 좋게 하는 것. 문법은 { } 가 정한다 |
다중 선택 — 등급 나누기
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
#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쪽 |