[Python 100일 챌린지] Day 14 - 불린 (bool) - 참과 거짓
[Python 100일 챌린지] Day 14 - 불린 (bool) - 참과 거짓
참(True)과 거짓(False)을 다루는 불린 타입을 배워봅시다! 조건문과 반복문의 핵심 개념으로, 프로그램의 흐름을 제어하는 기초입니다. (22분 완독 ⭐⭐)
🎯 오늘의 학습 목표
📚 사전 지식
🎯 학습 목표 1: bool 타입 이해하기
불린이란?
불린 = 참(True) 또는 거짓(False) 두 가지 값만 가지는 타입
프로그래밍에서 “예/아니오”, “참/거짓”을 표현하는 가장 기본적인 데이터 타입입니다.
1
2
3
4
is_sunny = True
is_raining = False
print(type(is_sunny)) # <class 'bool'>
불린을 사용하는 이유
- 조건 판단: if문, while문에서 조건 검사
- 상태 표현: 프로그램의 상태를 명확하게 표현
- 필터링: 데이터 필터링 및 검색
1
2
3
4
5
6
7
8
# 상태 표현
is_logged_in = True
has_permission = False
if is_logged_in and has_permission:
print("접근 허용")
else:
print("접근 거부")
🎯 학습 목표 2: 비교 연산자 익히기
비교 연산자란?
두 값을 비교해서 True 또는 False를 반환하는 연산자입니다.
| 연산자 | 의미 | 예시 |
|---|---|---|
== | 같음 | 5 == 5 → True |
!= | 다름 | 5 != 3 → True |
> | 큼 | 5 > 3 → True |
< | 작음 | 3 < 5 → True |
>= | 크거나 같음 | 5 >= 5 → True |
<= | 작거나 같음 | 3 <= 5 → True |
1
2
3
4
5
6
7
8
9
age = 18
print(age >= 18) # True (성인)
print(age < 18) # False (미성년자 아님)
# 문자열도 비교 가능
name = "Alice"
print(name == "Alice") # True
print(name != "Bob") # True
🎯 학습 목표 3: 논리 연산자 익히기
논리 연산자란?
여러 개의 조건을 결합하거나 반전시키는 연산자입니다.
and 연산자 (그리고)
둘 다 True여야 True를 반환
1
2
3
4
5
6
age = 25
has_license = True
# 나이도 충족하고 면허도 있어야 운전 가능
can_drive = age >= 18 and has_license
print(can_drive) # True
| A | B | A and B |
|---|---|---|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
or 연산자 (또는)
하나만 True여도 True를 반환
1
2
3
4
5
6
is_weekend = True
is_holiday = False
# 주말이거나 공휴일이면 쉼
can_rest = is_weekend or is_holiday
print(can_rest) # True
| A | B | A or B |
|---|---|---|
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
not 연산자 (부정)
True는 False로, False는 True로 반전
1
2
3
4
is_raining = False
is_sunny = not is_raining
print(is_sunny) # True
| A | not A |
|---|---|
| True | False |
| False | True |
조합 사용하기
1
2
3
4
5
6
7
age = 25
has_license = True
is_drunk = False
# 나이 충족, 면허 있음, 음주 안 함
can_drive = age >= 18 and has_license and not is_drunk
print(can_drive) # True
🎯 학습 목표 4: Truthy와 Falsy 값 알기
Truthy와 Falsy란?
Python에서는 bool 타입이 아닌 값들도 True 또는 False로 평가될 수 있습니다.
Falsy 값 (거짓으로 간주되는 값)
다음 값들은 조건문에서 False로 평가됩니다:
False(불린 거짓)0(정수 0)0.0(실수 0.0)""(빈 문자열)[](빈 리스트)()(빈 튜플){}(빈 딕셔너리)set()(빈 세트)None(값이 없음)
1
2
3
4
5
6
7
8
if not "":
print("빈 문자열은 False!") # 출력됨
if not 0:
print("0은 False!") # 출력됨
if not []:
print("빈 리스트는 False!") # 출력됨
Truthy 값 (참으로 간주되는 값)
Falsy가 아닌 모든 값은 True로 평가됩니다:
1
2
3
4
5
6
7
8
if "hello":
print("문자열이 있으면 True!") # 출력됨
if [1, 2, 3]:
print("리스트에 요소가 있으면 True!") # 출력됨
if 42:
print("0이 아닌 숫자는 True!") # 출력됨
실전 활용
1
2
3
4
5
6
7
# 사용자 입력 검증
user_input = input("이름을 입력하세요: ")
if user_input: # 빈 문자열이 아니면 True
print(f"안녕하세요, {user_input}님!")
else:
print("이름을 입력하지 않았습니다.")
주의: 0과 빈 리스트의 차이
1
2
3
4
5
6
7
# 0은 Falsy
if 0:
print("실행 안 됨")
# [0]은 Truthy (요소가 있음)
if [0]:
print("실행됨!") # 0은 있음 (리스트가 비어있지 않음)
💡 실전 팁 & 주의사항
Tip 1: and와 or 헷갈리지 않기
1
2
3
4
5
6
7
8
9
# and: 모두 True여야 True
age = 25
has_license = False
print(age >= 18 and has_license) # False
# or: 하나만 True여도 True
is_weekend = True
is_holiday = False
print(is_weekend or is_holiday) # True
Tip 2: not의 우선순위 주의
1
2
3
4
5
6
7
# ❌ 의도와 다를 수 있음
result = not True and False
print(result) # False (not True가 먼저 → False and False)
# ✅ 명확하게 괄호 사용
result = not (True and False)
print(result) # True
Tip 3: ==와 is의 차이
1
2
3
4
5
6
7
8
9
# == : 값이 같은지 비교
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (값이 같음)
print(a is b) # False (다른 객체)
# is : 같은 객체인지 비교
c = a
print(a is c) # True (같은 객체)
Tip 4: 단락 평가 (Short-circuit Evaluation)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# and: 첫 번째가 False면 두 번째 평가 안 함
def check1():
print("check1 실행")
return False
def check2():
print("check2 실행")
return True
result = check1() and check2() # "check1 실행"만 출력
print(result) # False
# or: 첫 번째가 True면 두 번째 평가 안 함
result = check2() or check1() # "check2 실행"만 출력
print(result) # True
Tip 5: Falsy 값 활용하기
1
2
3
4
5
6
7
8
9
10
# 빈 값 체크를 간단하게
user_input = ""
# ❌ 길게 쓰기
if user_input == "":
print("입력값이 없습니다")
# ✅ 간단하게 쓰기
if not user_input:
print("입력값이 없습니다")
🧪 연습 문제
실제로 코드를 작성하며 불린 타입과 논리 연산을 연습해봅시다!
문제 1: 윤년 판별기
과제: 주어진 연도가 윤년인지 판별하는 프로그램을 작성하세요.
윤년 규칙:
- 4로 나누어떨어지는 해는 윤년입니다
- 단, 100으로 나누어떨어지는 해는 평년입니다
- 단, 400으로 나누어떨어지는 해는 윤년입니다
초기 데이터:
1
year = 2024
요구사항:
- 각 조건을 개별 불린 변수로 저장
- 논리 연산자를 사용하여 윤년 판별
- 판별 결과와 이유를 출력
💡 힌트
%연산자로 나머지를 구해 나누어떨어지는지 확인하세요year % 4 == 0은 4로 나누어떨어진다는 의미입니다and,or,not연산자를 조합하세요- 우선순위: 400 → 100 → 4 순서로 확인
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
year = 2024
# 각 조건을 불린 변수로 저장
is_divisible_by_4 = year % 4 == 0
is_divisible_by_100 = year % 100 == 0
is_divisible_by_400 = year % 400 == 0
# 윤년 판별 로직
# (4의 배수 AND 100의 배수가 아님) OR 400의 배수
is_leap_year = (is_divisible_by_4 and not is_divisible_by_100) or is_divisible_by_400
# 결과 출력
print(f"===== 윤년 판별기 =====")
print(f"연도: {year}년")
print(f"4의 배수: {is_divisible_by_4}")
print(f"100의 배수: {is_divisible_by_100}")
print(f"400의 배수: {is_divisible_by_400}")
print(f"\n결과: {year}년은 {'윤년' if is_leap_year else '평년'}입니다.")
# 여러 연도 테스트
test_years = [2000, 1900, 2024, 2023, 2100]
print(f"\n===== 여러 연도 테스트 =====")
for test_year in test_years:
is_div_4 = test_year % 4 == 0
is_div_100 = test_year % 100 == 0
is_div_400 = test_year % 400 == 0
is_leap = (is_div_4 and not is_div_100) or is_div_400
print(f"{test_year}년: {'윤년' if is_leap else '평년'}")
출력:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
===== 윤년 판별기 =====
연도: 2024년
4의 배수: True
100의 배수: False
400의 배수: False
결과: 2024년은 윤년입니다.
===== 여러 연도 테스트 =====
2000년: 윤년
1900년: 평년
2024년: 윤년
2023년: 평년
2100년: 평년
문제 2: 비밀번호 강도 검사기
과제: 비밀번호가 강력한지 검사하는 프로그램을 작성하세요.
강력한 비밀번호 조건:
- 길이가 8자 이상
- 대문자 포함
- 소문자 포함
- 숫자 포함
- 특수문자 포함
초기 데이터:
1
password = "Pass123!"
요구사항:
- 각 조건을 개별 불린 변수로 저장
for루프로 문자 하나씩 검사- 모든 조건 충족 여부 확인
- 상세한 검사 결과 출력
💡 힌트
len(password)로 길이 확인isupper(): 대문자인지 확인islower(): 소문자인지 확인isdigit(): 숫자인지 확인isalnum(): 알파벳이나 숫자인지 확인 (특수문자는False)- 하나라도 발견하면
break로 루프 종료 가능
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
password = "Pass123!"
# 1. 길이 체크 (간단)
is_long_enough = len(password) >= 8
# 2. 대문자 포함 체크
has_upper = False
for char in password:
if char.isupper():
has_upper = True
break
# 3. 소문자 포함 체크
has_lower = False
for char in password:
if char.islower():
has_lower = True
break
# 4. 숫자 포함 체크
has_digit = False
for char in password:
if char.isdigit():
has_digit = True
break
# 5. 특수문자 포함 체크
# isalnum()이 False면 특수문자
has_special = False
for char in password:
if not char.isalnum():
has_special = True
break
# 모든 조건을 and로 결합
is_strong = has_upper and has_lower and has_digit and has_special and is_long_enough
# 결과 출력
print(f"===== 비밀번호 강도 검사 =====")
print(f"비밀번호: {password}")
print(f"\n검사 항목:")
print(f"✓ 8자 이상: {is_long_enough}")
print(f"✓ 대문자 포함: {has_upper}")
print(f"✓ 소문자 포함: {has_lower}")
print(f"✓ 숫자 포함: {has_digit}")
print(f"✓ 특수문자 포함: {has_special}")
print(f"\n{'✅ 강력한 비밀번호입니다!' if is_strong else '❌ 약한 비밀번호입니다. 조건을 확인하세요.'}")
# 여러 비밀번호 테스트
print(f"\n===== 여러 비밀번호 테스트 =====")
test_passwords = [
"Pass123!", # 강력함
"password", # 약함 (대문자, 숫자, 특수문자 없음)
"PASSWORD", # 약함 (소문자, 숫자, 특수문자 없음)
"Pass1234", # 약함 (특수문자 없음)
"Abc!@#" # 약함 (8자 미만)
]
for pwd in test_passwords:
# 각 조건 체크
long = len(pwd) >= 8
# 대문자 체크
upper = False
for c in pwd:
if c.isupper():
upper = True
break
# 소문자 체크
lower = False
for c in pwd:
if c.islower():
lower = True
break
# 숫자 체크
digit = False
for c in pwd:
if c.isdigit():
digit = True
break
# 특수문자 체크
special = False
for c in pwd:
if not c.isalnum():
special = True
break
strong = long and upper and lower and digit and special
print(f"{pwd:12} → {'강력' if strong else '약함'}")
출력:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
===== 비밀번호 강도 검사 =====
비밀번호: Pass123!
검사 항목:
✓ 8자 이상: True
✓ 대문자 포함: True
✓ 소문자 포함: True
✓ 숫자 포함: True
✓ 특수문자 포함: True
✅ 강력한 비밀번호입니다!
===== 여러 비밀번호 테스트 =====
Pass123! → 강력
password → 약함
PASSWORD → 약함
Pass1234 → 약함
Abc!@# → 약함
🎯 연습 문제 핵심 포인트
문제 1에서 배운 것:
- 복잡한 논리 조건을 불린 변수로 분리하기
and,or,not연산자 조합하기- 조건의 우선순위 이해하기
문제 2에서 배운 것:
for루프로 문자열의 각 문자 검사하기- 문자열 메서드 활용 (
isupper(),islower(),isdigit(),isalnum()) - 여러 조건을
and로 결합하여 최종 판단하기 - 조기 종료 (
break) 활용하기
📝 오늘 배운 내용 정리
- 불린 타입:
True와False두 가지 값만 가지는 데이터 타입 - 비교 연산자:
==,!=,>,<,>=,<=로 값 비교 - 논리 연산자:
and,or,not으로 조건 결합 - Truthy와 Falsy: 모든 값은 불린 컨텍스트에서 참 또는 거짓으로 평가됨
- 단락 평가: 논리 연산자는 필요한 만큼만 평가함
- 용도: 조건문, 반복문, 필터링, 검증 로직
🔗 관련 자료
📚 이전 학습
Day 13: 세트 다루기 (set) ⭐⭐
어제는 중복을 허용하지 않는 세트(집합) 자료구조를 배웠습니다!
📚 다음 학습
Day 15: 자료형 변환 (타입 캐스팅) ⭐⭐
내일은 데이터 타입을 자유자재로 변환하는 방법을 배웁니다!
“늦었다고 생각할 때가 가장 빠른 시기입니다!” 🚀
Day 14/100 Phase 2: 자료형 마스터하기 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
