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

비교하고 판단하는 연산자

비교 연산자논리 연산자참과 거짓연산자 우선순위

코드 예제: 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) — 참·거짓을 엮어 새로운 참·거짓을 만드는 연산자는 조건 여러 개를 하나로 묶는다.

논리 연산자
하는 일PythonC언제 참인가
그리고and&&양쪽이 모두 참일 때
또는or||하나라도 참일 때
아니다not!뒤집는다
Python윤년 판별과 비교·논리 연산
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
C윤년 판별과 비교·논리 연산확인된 출력
#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로 나타낸다.

참·거짓을 나타내는 방식
PythonC
참True1 (0이 아닌 값 전부)
거짓False0
조건에 숫자를 쓰면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쪽