이 페이지의 목차
비교하고 판단하는 연산자
코드 예제: Python · C · 예상 50분
학습 목표
- 비교 연산자와 논리 연산자의 결과가 참과 거짓임을 설명한다.
- 여러 조건을 논리 연산자로 결합한다.
관련 성취기준
- 프그02-03
산술, 비교, 논리 등의 여러 종류의 연산자 의미를 알고 프로그래밍에 적절하게 사용할 수 있다.
생각 열기 — 윤년인지 아닌지
윤년 규칙은 이렇다.
4로 나누어떨어지면 윤년이다. 다만 100으로 나누어떨어지면 윤년이 아니다. 그런데 400으로 나누어떨어지면 다시 윤년이다.
2024는 윤년, 2100은 아니고, 2000은 윤년이다.
비교 연산자 — 결과는 참 또는 거짓
비교 연산자(comparison operator) — 두 값을 견주어 참 또는 거짓을 돌려주는 연산자의 결과는 숫자가 아니라 참이나 거짓이다.
| 하는 일 | 기호 | 보기 | 결과 |
|---|---|---|---|
| 같다 | == | 3 == 5 | 거짓 |
| 다르다 | != | 3 != 5 | 참 |
| 크다 | > | 5 > 3 | 참 |
| 작다 | < | 3 < 5 | 참 |
| 크거나 같다 | >= | 3 >= 3 | 참 |
| 작거나 같다 | <= | 3 <= 3 | 참 |
논리 연산자 — 조건을 엮는다
논리 연산자(logical operator) — 참·거짓을 엮어 새로운 참·거짓을 만드는 연산자는 조건 여러 개를 하나로 묶는다.
| 하는 일 | Python | C | 언제 참인가 |
|---|---|---|---|
| 그리고 | and | && | 양쪽이 모두 참일 때 |
| 또는 | or | || | 하나라도 참일 때 |
| 아니다 | not | ! | 뒤집는다 |
for 해 in [2024, 2100, 2000, 2023]:
윤년 = (해 % 4 == 0 and 해 % 100 != 0) or (해 % 400 == 0)
print(해, "->", 윤년)
print(3 < 5, 3 == 5, 3 != 5)
print(True and False, True or False, not True)2024 -> True 2100 -> False 2000 -> True 2023 -> False True False True False True False
#include <stdio.h>
int main(void)
{
int years[] = {2024, 2100, 2000, 2023};
for (int i = 0; i < 4; i++) {
int y = years[i];
int leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
printf("%d -> %d\n", y, leap);
}
printf("%d %d %d\n", 3 < 5, 3 == 5, 3 != 5);
printf("%d %d %d\n", 1 && 0, 1 || 0, !1);
return 0;
}2024 -> 1 2100 -> 0 2000 -> 1 2023 -> 0 1 0 1 0 1 0
True 와 1 — 결과를 적는 방식만 다르다
두 출력을 견줘 보자. Python은 True·False 로 찍고 C는 1·0 으로 찍는다. 판정 결과는 똑같다. 2차시 「더 알아보기」에서 말한 대로 C에는 논리형이 원래 없어 0과 1로 나타낸다.
| Python | C | |
|---|---|---|
| 참 | True | 1 (0이 아닌 값 전부) |
| 거짓 | False | 0 |
| 조건에 숫자를 쓰면 | 0은 거짓, 나머지는 참 | 같다 |
| 조건에 빈 값을 쓰면 | 빈 문자열·빈 리스트도 거짓 | 해당 없음 |
윤년 식을 뜯어 보기
(해 % 4 == 0 and 해 % 100 != 0) or (해 % 400 == 0)
└─── 4의 배수 ─┘ └── 100의 배수가 아니다 ──┘ └── 400의 배수 ──┘
└──────────── 둘 다 참이어야 한다 ────────────┘
└──────────────── 이쪽이거나 저쪽이면 윤년 ───────────────┘
| 해 | 4의 배수 | 100의 배수 아님 | and 결과 | 400의 배수 | 최종 |
|---|---|---|---|---|---|
| 2024 | 참 | 참 | 참 | 거짓 | 참 |
| 2100 | 참 | 거짓 | 거짓 | 거짓 | 거짓 |
| 2000 | 참 | 거짓 | 거짓 | 참 | 참 |
| 2023 | 거짓 | 참 | 거짓 | 거짓 | 거짓 |
2000년이 핵심이다. 앞의 and 는 거짓인데 뒤의 or 덕분에 참이 된다. 400의 배수라는 예외 규칙이 이 자리에서 살아난다.
여러 조건을 엮을 때 흔한 함정
| 이렇게 쓰면 | 무슨 일이 생기나 | 이렇게 쓴다 |
|---|---|---|
0 < 점수 < 100 (C) | C에서는 뜻이 어긋난다. 왼쪽부터 둘씩 계산해 늘 참이 된다 | 점수 > 0 && 점수 < 100 |
if (x = 5) (C) | 넣기가 되어 늘 참 | if (x == 5) |
합계 == 0.3 | 실수는 오차가 있어 예상과 다를 수 있다 | 차이가 아주 작은지 본다 |
점수 > 0 으로 0 이상 판정 | 0이 걸러진다 | 점수 >= 0 |
마지막 줄이 3단원 7·8차시에서 실제로 겪은 그 잘못이다. 부등호에 등호를 붙였는지가 경계값에서 갈리고, 경계값을 넣어 보지 않으면 끝까지 통과한다.
활동
윤년 판별 조건식 만들기
약 25분1단계 — 표를 손으로 채운다 (10분)
계산기 없이 채운다.
| 해 | 4의 배수? | 100의 배수? | 400의 배수? | 윤년인가 |
|---|---|---|---|---|
| 2024 | ||||
| 2023 | ||||
| 1900 | ||||
| 2000 | ||||
| 2400 |
2단계 — 코드로 확인한다 (5분)
실행기의 [고치기]로 목록에 위 해들을 넣어 실행하고 1단계와 대조한다.
3단계 — 일부러 틀려 본다 (5분)
조건식을 하나씩 바꿔 보고 어느 해에서 답이 틀어지는지 찾는다.
| 바꾼 식 | 틀어지는 해 | 왜 |
|---|---|---|
and 를 or 로 |
||
!= 0 을 == 0 으로 |
||
뒤의 or (해 % 400 == 0) 을 지우면 |
||
% 4 를 % 2 로 |
세 번째 줄이 특히 중요하다. 400 조건을 지우면 어느 해가 틀리는가?
4단계 — 다른 조건을 만든다 (5분)
점수가 0 이상 100 이하인지 판정하는 조건식을 두 언어로 각각 적는다.
| 조건식 | 0을 넣으면 | 100을 넣으면 | −1을 넣으면 | |
|---|---|---|---|---|
| Python | ||||
| C |
- Python에서
0 <= 점수 <= 100이 되는가? - C에서 같은 표기를 쓰면 어떻게 되는가? 왜 그런지 적는다.
- 등호를 빼고
0 < 점수로 하면 어느 값에서 답이 갈리는가?
개념 확인 문제
보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.
비교 연산의 결과로 나오는 값은?프그02-03
C에서 if (x = 5) 가 위험한 까닭은?프그02-03
윤년 식에서 뒤의 or (해 % 400 == 0) 을 지우면 어느 해가 틀리게 판정되는가?프그02-03
C에서 0 < 점수 < 100 이라고 적으면?프그02-03
점수 >= 0 대신 점수 > 0 으로 적으면 어느 값에서 답이 갈리는가?프그02-03
and 와 or 의 차이를 바르게 설명한 것은?프그02-03
더 알아보기
심화앞이 정해지면 뒤는 보지 않는다
a != 0 and 100 / a > 5 라는 조건을 보자. a 가 0이면 뒤의 나눗셈에서 0으로 나누게 된다. 그런데 실제로는 오류가 나지 않는다. and 는 앞이 거짓이면 뒤를 아예 계산하지 않기 때문이다. or 도 앞이 참이면 뒤를 보지 않는다. 이것을 단축 평가라 한다.
이 성질을 알면 안전 장치를 조건 순서로 만들 수 있다. 위험한 계산 앞에 검사를 두면 되는 것이다. 반대로 뒤쪽 조건에 값을 바꾸는 일을 넣어 두면, 실행될 때도 있고 안 될 때도 있어 찾기 어려운 잘못이 된다. 조건식에는 값을 바꾸는 일을 넣지 않는다.
심화실수를 == 로 견주지 않는다
2차시에서 0.1 + 0.2 가 정확히 0.3 이 되지 않는다고 했다. 그래서 if 합계 == 0.3: 은 예상과 다르게 동작할 수 있다. 실수를 견줄 때는 차이가 아주 작은지를 본다.
if abs(합계 - 0.3) < 0.000001:“충분히 가까우면 같다고 보자”는 뜻이다. 얼마나 가까워야 같은 것으로 볼지는 다루는 값의 성질이 정한다 — 성적이라면 0.05, 과학 계산이라면 훨씬 작은 값을 쓴다. 3단원 2차시에서 “판정할 수 있게 적는다”고 한 것이 이런 자리에도 적용된다.
실무조건이 길어지면 이름을 붙인다
윤년 식처럼 조건이 길어지면 한눈에 안 읽힌다. 이럴 때 중간 결과에 이름을 붙이면 읽기 쉬워진다.
사년배수 = 해 % 4 == 0
백년배수 = 해 % 100 == 0
사백년배수 = 해 % 400 == 0
윤년 = (사년배수 and not 백년배수) or 사백년배수줄 수는 늘었지만 마지막 줄이 규칙을 그대로 읽어 준다. 1차시에서 “좋은 이름이 주석을 줄인다”고 한 것이 조건식에도 그대로 적용된다. 조건이 셋을 넘어가면 이 방법을 검토할 만하다.
이어지는 학습
이 차시를 이해하려면 다음을 먼저 알아야 한다.
- 7차시의 산술 연산자 — 프로그래밍 프그02-03
교과서에서 찾기
| 교과서 | 해당 위치 | 쪽수 |
|---|---|---|
| 성림출판(Python) | 프로그래밍의 기초 › 03 연산자 | 112쪽 |
| 씨마스커뮤니케이션(Python) | 프로그래밍 기초 › 3 연산자 | 110쪽 |
| 삼양미디어(Python) | 프로그래밍의 기초 › 02 데이터 연산 | 68쪽 |
| 삼양미디어(C) | 프로그래밍의 기초 › 02 데이터 연산 | 74쪽 |
| 씨마스(C) | C 프로그래밍의 기초 › 3 연산자 | 84쪽 |
| 웅보출판사(C) | 프로그래밍의 기초 › Chapter 03 연산자 | 99쪽 |