포스트

[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'>

불린을 사용하는 이유

  1. 조건 판단: if문, while문에서 조건 검사
  2. 상태 표현: 프로그램의 상태를 명확하게 표현
  3. 필터링: 데이터 필터링 및 검색
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: 윤년 판별기

과제: 주어진 연도가 윤년인지 판별하는 프로그램을 작성하세요.

윤년 규칙:

  1. 4로 나누어떨어지는 해는 윤년입니다
  2. 단, 100으로 나누어떨어지는 해는 평년입니다
  3. 단, 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: 비밀번호 강도 검사기

과제: 비밀번호가 강력한지 검사하는 프로그램을 작성하세요.

강력한 비밀번호 조건:

  1. 길이가 8자 이상
  2. 대문자 포함
  3. 소문자 포함
  4. 숫자 포함
  5. 특수문자 포함

초기 데이터:

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) 활용하기

📝 오늘 배운 내용 정리

  1. 불린 타입: TrueFalse 두 가지 값만 가지는 데이터 타입
  2. 비교 연산자: ==, !=, >, <, >=, <=로 값 비교
  3. 논리 연산자: and, or, not으로 조건 결합
  4. Truthy와 Falsy: 모든 값은 불린 컨텍스트에서 참 또는 거짓으로 평가됨
  5. 단락 평가: 논리 연산자는 필요한 만큼만 평가함
  6. 용도: 조건문, 반복문, 필터링, 검증 로직

🔗 관련 자료


📚 이전 학습

Day 13: 세트 다루기 (set) ⭐⭐

어제는 중복을 허용하지 않는 세트(집합) 자료구조를 배웠습니다!

📚 다음 학습

Day 15: 자료형 변환 (타입 캐스팅) ⭐⭐

내일은 데이터 타입을 자유자재로 변환하는 방법을 배웁니다!


“늦었다고 생각할 때가 가장 빠른 시기입니다!” 🚀

Day 14/100 Phase 2: 자료형 마스터하기 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.