05. 불리언과 비교
- 참/거짓을 나타내는
True/False(불리언)를 이해한다. - 비교 연산자(
==,!=,<,>=…)로 두 값을 비교한다. and·or·not으로 여러 조건을 조합한다.- "참 같은 값/거짓 같은 값"(Truthy/Falsy)이라는 파이썬다운 개념을 안다.
불리언: 참과 거짓
지금까지 본 값은 숫자와 문자열이었습니다. 이번엔 딱 두 가지 값만 가지는 특별한 자료형, 불리언(boolean)입니다.
True(참)False(거짓)
전등 스위치를 떠올리면 됩니다. 켜짐(True) 아니면 꺼짐(False), 그 중간은 없습니다.
is_open = True is_raining = False print(is_open) # True print(type(is_open)) # <class 'bool'>
true, TRUE는 에러가 납니다. True, False만 맞습니다.불리언이 왜 중요할까요? 다음 장에서 배울 조건문(if)이 바로 이 참/거짓을 보고 "할지 말지"를 결정하기 때문입니다. 불리언은 프로그램이 판단을 내리는 재료입니다.
비교 연산자
두 값을 비교하면 그 결과로 불리언이 나옵니다.
| 연산자 | 의미 | 예 | 결과 |
|---|---|---|---|
== | 같다 | 10 == 10 | True |
!= | 다르다 | 10 != 5 | True |
> | 크다 | 10 > 5 | True |
< | 작다 | 10 < 5 | False |
>= | 크거나 같다 | 3 >= 3 | True |
<= | 작거나 같다 | 2 <= 3 | True |
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가 납니다. 이 에러를 보면 "아, ==를 써야 하는데 =를 썼구나"를 떠올리세요.문자열도 비교할 수 있습니다. ==는 내용이 같은지를 봅니다.
print("apple" == "apple") # True print("apple" == "Apple") # False ← 대소문자 구분! print("a" < "b") # True (사전 순서)
논리 연산자: 조건 조합하기
조건 여러 개를 묶을 때 and, or, not을 씁니다.
| 연산자 | 의미 | 참이 되는 때 |
|---|---|---|
and | 그리고 | 둘 다 참일 때만 참 |
or | 또는 | 하나라도 참이면 참 |
not | 부정 | 참 ↔ 거짓 뒤집기 |
print(True and True) # True print(True and False) # False (하나라도 거짓이면 거짓) print(True or False) # True (하나라도 참이면 참) print(not True) # False
실제로는 비교와 함께 씁니다. 예를 들어 "성인이면서 65세 미만"은 이렇게 씁니다.
age = 20 print(age >= 18 and age < 65) # True (둘 다 만족) temperature = 35 print(temperature < 0 or temperature > 30) # True (덥거나 춥거나)
진리표
and와 or의 동작을 표로 정리하면 이렇습니다.
| A | B | A and B | A or B |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
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은 수학처럼 한 번에 쓸 수 있습니다.
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()로 확인해 봅시다.
# 거짓처럼 취급되는 값(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 (참 취급) |
|---|---|
False | True |
0, 0.0 | 0이 아닌 모든 숫자 |
"" (빈 문자열) | 비어 있지 않은 문자열 |
[], {}, () (빈 컬렉션) | 비어 있지 않은 컬렉션 |
None | 그 외 대부분의 값 |
📎 여기서 컬렉션(collection)은 리스트·튜플·세트·딕셔너리처럼 여러 값을 하나로 묶어 담는 자료형을 통틀어 부르는 말입니다. 빈 컬렉션([],{},())은 "아무것도 안 든 그릇"이라 거짓으로 취급됩니다. 각 컬렉션의 정체는 06. 자료구조에서 자세히 다룹니다.
이 개념이 왜 유용할까요? 다음 장 조건문에서 "리스트가 비어 있지 않으면"을 if len(my_list) > 0 대신 그냥 if my_list로 쓸 수 있기 때문입니다 — 훨씬 파이썬답습니다.
💡 and/or의 숨은 활용 (참고)
and와 or는 사실 True/False만 돌려주는 게 아니라, 값 자체를 돌려줍니다. 이를 이용한 파이썬다운 요령이 있습니다.
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)를 예상하세요.
5 == 5.0 "Python" == "python" 3 != 3 10 >= 10
문제 2. score = 75일 때, 점수가 60 이상 90 미만인지를 연쇄 비교로 확인해 출력하세요.
문제 3. 다음 각 값을 bool()에 넣으면 무엇이 나올까요?
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.0→True(값이 같으면 정수·실수 구분 없이 같다고 봄)"Python" == "python"→False(대소문자 구분)3 != 3→False10 >= 10→True
2.
score = 75 print(60 <= score < 90) # True
3.
bool(0)→Falsebool(-1)→True(0이 아니면 참, 음수도 참!)bool("")→Falsebool("False")→True⚠️ 글자가 들어 있는 문자열이므로 참! ("False"라는 글자에 속지 마세요)
4.
pw = "secure_pw" print(len(pw) >= 8 and not ("123" in pw)) # True # not "123" in pw 처럼 괄호 없이 써도 됩니다
</details>
◀️ 이전 장: 04. 문자열과 입력 | ▶️ 다음 장: 06. 리스트·튜플·세트·딕셔너리