05. 불리언과 비교

🎯 이 장의 목표
  • 참/거짓을 나타내는 True/False(불리언)를 이해한다.
  • 비교 연산자(==, !=, <, >= …)로 두 값을 비교한다.
  • and·or·not으로 여러 조건을 조합한다.
  • "참 같은 값/거짓 같은 값"(Truthy/Falsy)이라는 파이썬다운 개념을 안다.

불리언: 참과 거짓

지금까지 본 값은 숫자와 문자열이었습니다. 이번엔 딱 두 가지 값만 가지는 특별한 자료형, 불리언(boolean)입니다.

  • True (참)
  • False (거짓)

전등 스위치를 떠올리면 됩니다. 켜짐(True) 아니면 꺼짐(False), 그 중간은 없습니다.

PYTHON
is_open = True
is_raining = False
print(is_open)          # True
print(type(is_open))    # <class 'bool'>
⚠️ 흔한 실수
흔한 함정: 반드시 첫 글자만 대문자입니다. true, TRUE는 에러가 납니다. True, False만 맞습니다.

불리언이 왜 중요할까요? 다음 장에서 배울 조건문(if)이 바로 이 참/거짓을 보고 "할지 말지"를 결정하기 때문입니다. 불리언은 프로그램이 판단을 내리는 재료입니다.

비교 연산자

두 값을 비교하면 그 결과로 불리언이 나옵니다.

연산자의미결과
==같다10 == 10True
!=다르다10 != 5True
>크다10 > 5True
<작다10 < 5False
>=크거나 같다3 >= 3True
<=작거나 같다2 <= 3True
PYTHON
print(10 > 5)      # True
print(10 == 10)    # True
print(10 != 5)     # True
print(3 <= 2)      # False
⚠️ 흔한 실수
가장 흔한 입문자 실수: 비교는 등호 두 개 ==입니다. 등호 하나 =는 2장에서 본 할당입니다. 둘은 완전히 다릅니다!
```python
x = 5 # 할당: x에 5를 넣어라
x == 5 # 비교: x가 5와 같은가? (True/False)
```
if x = 5처럼 비교할 자리에 =를 쓰면 SyntaxError가 납니다. 이 에러를 보면 "아, ==를 써야 하는데 =를 썼구나"를 떠올리세요.

문자열도 비교할 수 있습니다. ==는 내용이 같은지를 봅니다.

PYTHON
print("apple" == "apple")   # True
print("apple" == "Apple")   # False  ← 대소문자 구분!
print("a" < "b")            # True   (사전 순서)

논리 연산자: 조건 조합하기

조건 여러 개를 묶을 때 and, or, not을 씁니다.

연산자의미참이 되는 때
and그리고둘 다 참일 때만 참
or또는하나라도 참이면 참
not부정참 ↔ 거짓 뒤집기
PYTHON
print(True and True)    # True
print(True and False)   # False   (하나라도 거짓이면 거짓)
print(True or False)    # True    (하나라도 참이면 참)
print(not True)         # False

실제로는 비교와 함께 씁니다. 예를 들어 "성인이면서 65세 미만"은 이렇게 씁니다.

PYTHON
age = 20
print(age >= 18 and age < 65)   # True   (둘 다 만족)

temperature = 35
print(temperature < 0 or temperature > 30)   # True  (덥거나 춥거나)

진리표

andor의 동작을 표로 정리하면 이렇습니다.

ABA and BA or B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse
flowchart TD
    Q["나이 >= 18<br/>and<br/>회원이다"]:::proc
    Q -->|둘 다 참| Yes["입장 허용 ✅"]:::result
    Q -->|하나라도 거짓| No["입장 불가"]:::err

    classDef proc fill:#7fd8d8,stroke:#2a9d8f,color:#14532d
    classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d
    classDef err fill:#f4b6b6,stroke:#d64545,color:#7a1f1f

⭐ 연쇄 비교: 파이썬다운 범위 검사

다른 많은 언어에서 "18 이상 65 미만"을 쓰려면 age >= 18 and age < 65처럼 써야 합니다. 그런데 Python은 수학처럼 한 번에 쓸 수 있습니다.

PYTHON
age = 20

# ❌ 나쁜 예 (다른 언어 스타일): 틀리진 않지만 장황
print(age >= 18 and age < 65)   # True

# ✅ 좋은 예 (파이썬다운): 수학처럼 자연스럽게
print(18 <= age < 65)           # True

18 <= age < 65는 "18 이상이고 동시에 65 미만"이라는 뜻으로, 수학 표기 18 ≤ age < 65와 똑같이 읽힙니다.

📌 핵심
핵심: 범위 검사는 low <= x < high처럼 연쇄 비교로 쓰는 게 파이썬답다. x >= low and x < high보다 짧고 읽기 쉽다.

Truthy와 Falsy: 참 같은 값, 거짓 같은 값

여기서 Python의 멋진 특징 하나를 봅시다. True/False가 아닌 값도 불리언 맥락에서는 참 또는 거짓처럼 취급됩니다. bool()로 확인해 봅시다.

PYTHON
# 거짓처럼 취급되는 값(Falsy)
print(bool(0))      # False   ← 숫자 0
print(bool(""))     # False   ← 빈 문자열
print(bool([]))     # False   ← 빈 리스트 (다음 장)
print(bool(None))   # False   ← None (값이 없음을 뜻하는 특수값)

# 참처럼 취급되는 값(Truthy)
print(bool(42))     # True    ← 0이 아닌 숫자
print(bool("hi"))   # True    ← 비어 있지 않은 문자열
print(bool([1, 2])) # True    ← 비어 있지 않은 리스트

규칙은 단순합니다. "비어 있거나 0이면 거짓, 뭔가 들어 있으면 참"입니다.

Falsy (거짓 취급)Truthy (참 취급)
FalseTrue
0, 0.00이 아닌 모든 숫자
"" (빈 문자열)비어 있지 않은 문자열
[], {}, () (빈 컬렉션)비어 있지 않은 컬렉션
None그 외 대부분의 값
📎 여기서 컬렉션(collection)은 리스트·튜플·세트·딕셔너리처럼 여러 값을 하나로 묶어 담는 자료형을 통틀어 부르는 말입니다. 빈 컬렉션([], {}, ())은 "아무것도 안 든 그릇"이라 거짓으로 취급됩니다. 각 컬렉션의 정체는 06. 자료구조에서 자세히 다룹니다.

이 개념이 왜 유용할까요? 다음 장 조건문에서 "리스트가 비어 있지 않으면"을 if len(my_list) > 0 대신 그냥 if my_list로 쓸 수 있기 때문입니다 — 훨씬 파이썬답습니다.

💡 팁
지금은 "0과 빈 것은 거짓, 나머지는 참"만 기억하세요. 활용법은 7장에서 자연스럽게 익히게 됩니다.

💡 and/or의 숨은 활용 (참고)

andor는 사실 True/False만 돌려주는 게 아니라, 값 자체를 돌려줍니다. 이를 이용한 파이썬다운 요령이 있습니다.

PYTHON
user_input = ""
name = user_input or "손님"     # user_input이 비었으면(Falsy) "손님" 사용
print(name)                     # 손님

user_input = "민지"
name = user_input or "손님"     # user_input이 차 있으면 그대로 사용
print(name)                     # 민지

A or B는 "A가 참 같으면 A를, 아니면 B를" 돌려줍니다. 그래서 "값이 없으면 기본값"이라는 흔한 패턴을 한 줄로 씁니다. 지금 당장 외울 필요는 없지만, 이런 코드를 봤을 때 당황하지 않도록 알아두세요.

이 장에서 배운 것

  • 불리언True/False 두 값뿐이며, 첫 글자만 대문자다. 프로그램이 판단을 내리는 재료다.
  • 비교 연산자(==, !=, <, >= …)의 결과는 불리언이다. 비교는 ==(두 개), 할당은 =(하나).
  • 논리 연산자 and(둘 다 참), or(하나라도 참), not(뒤집기)으로 조건을 조합한다.
  • 범위 검사는 low <= x < high 연쇄 비교가 파이썬답다.
  • Truthy/Falsy: 0과 빈 것은 거짓, 뭔가 들어 있으면 참으로 취급된다.

🧪 실습 문제

문제 1. 다음 각 식의 결과(True/False)를 예상하세요.

PYTHON
5 == 5.0
"Python" == "python"
3 != 3
10 >= 10

문제 2. score = 75일 때, 점수가 60 이상 90 미만인지를 연쇄 비교로 확인해 출력하세요.

문제 3. 다음 각 값을 bool()에 넣으면 무엇이 나올까요?

PYTHON
bool(0)
bool(-1)
bool("")
bool("False")

문제 4. 비밀번호 검사: pw가 8자 이상이고 동시에 "123"을 포함하지 않을 때 True가 되도록 식을 작성하세요. (pw = "secure_pw" 기준, 힌트: len(), in, and, not)

<details>

<summary>✅ 정답·해설 보기</summary>

1.

  • 5 == 5.0True (값이 같으면 정수·실수 구분 없이 같다고 봄)
  • "Python" == "python"False (대소문자 구분)
  • 3 != 3False
  • 10 >= 10True

2.

PYTHON
score = 75
print(60 <= score < 90)   # True

3.

  • bool(0)False
  • bool(-1)True (0이 아니면 참, 음수도 참!)
  • bool("")False
  • bool("False")True ⚠️ 글자가 들어 있는 문자열이므로 참! ("False"라는 글자에 속지 마세요)

4.

PYTHON
pw = "secure_pw"
print(len(pw) >= 8 and not ("123" in pw))   # True
# not "123" in pw 처럼 괄호 없이 써도 됩니다

</details>

◀️ 이전 장: 04. 문자열과 입력 | ▶️ 다음 장: 06. 리스트·튜플·세트·딕셔너리