포스트

[Python 100일 챌린지] Day 15 - 자료형 변환 (타입 캐스팅)

[Python 100일 챌린지] Day 15 - 자료형 변환 (타입 캐스팅)

숫자를 문자열로, 문자열을 숫자로! 서로 다른 데이터 타입을 자유자재로 변환하는 방법을 배워봅시다. input()으로 받은 문자열을 계산하거나, 숫자를 문자열과 합치는 등 실전에서 가장 자주 쓰이는 필수 기술입니다! (20분 완독 ⭐⭐)

🎯 오늘의 학습 목표

📚 사전 지식


🎯 학습 목표 1: 타입 변환이 무엇인지 이해하기

타입 캐스팅이란?

타입 캐스팅 = 한 자료형을 다른 자료형으로 변환하는 것

프로그래밍에서 데이터는 각자의 타입(자료형)을 가지고 있습니다. 때로는 이 타입을 바꿔야 할 때가 있습니다.

1
2
3
4
5
6
7
# 문자열 → 숫자
age_str = "25"
age_int = int(age_str)  # 25

# 숫자 → 문자열
score = 100
score_str = str(score)  # "100"

타입 변환이 필요한 이유

  1. 사용자 입력 처리: input()은 항상 문자열을 반환하므로 숫자로 변환 필요
  2. 데이터 조합: 숫자와 문자열을 합칠 때 타입을 맞춰야 함
  3. 연산 수행: 문자열로 된 숫자는 계산 불가능
1
2
3
4
5
6
7
# ❌ 에러 발생!
num = input("숫자 입력: ")  # "10" (문자열)
result = num + 5  # TypeError!

# ✅ 타입 변환 후 계산
num = int(input("숫자 입력: "))  # 10 (정수)
result = num + 5  # 15

🎯 학습 목표 2: 명시적 변환 사용하기

명시적 변환이란?

명시적 변환 = 프로그래머가 직접 변환 함수를 사용하는 것

Python에서는 int(), float(), str() 함수를 사용해 자료형을 명시적으로 변환할 수 있습니다.

int() - 정수로 변환

다양한 타입을 정수로 변환합니다.

입력 타입 예시 결과 설명
문자열 int("10") 10 숫자 문자열 → 정수
실수 int(3.14) 3 소수점 버림 (반올림 아님!)
불린 int(True) 1 True는 1, False는 0
1
2
3
4
5
6
7
8
9
10
11
12
13
# 문자열 → 정수
print(int("10"))      # 10
print(int("100"))     # 100
print(int("-25"))     # -25 (음수도 가능)

# 실수 → 정수 (소수점 버림)
print(int(3.14))      # 3
print(int(9.99))      # 9 (10 아님! 반올림 안 함)
print(int(-2.5))      # -2

# 불린 → 정수
print(int(True))      # 1
print(int(False))     # 0

float() - 실수로 변환

다양한 타입을 실수로 변환합니다.

입력 타입 예시 결과 설명
문자열 float("3.14") 3.14 실수 문자열 → 실수
정수 float(10) 10.0 정수 → 실수
불린 float(True) 1.0 True는 1.0, False는 0.0
1
2
3
4
5
6
7
8
9
10
11
12
13
# 문자열 → 실수
print(float("3.14"))  # 3.14
print(float("10"))    # 10.0
print(float("-2.5"))  # -2.5

# 정수 → 실수
print(float(10))      # 10.0
print(float(100))     # 100.0
print(float(-5))      # -5.0

# 불린 → 실수
print(float(True))    # 1.0
print(float(False))   # 0.0

str() - 문자열로 변환

모든 타입을 문자열로 변환합니다.

입력 타입 예시 결과 설명
정수 str(100) "100" 정수 → 문자열
실수 str(3.14) "3.14" 실수 → 문자열
불린 str(True) "True" 불린 → 문자열
리스트 str([1,2,3]) "[1, 2, 3]" 리스트 → 문자열
1
2
3
4
5
6
7
8
9
10
11
# 숫자 → 문자열
print(str(100))       # "100"
print(str(3.14))      # "3.14"
print(str(-25))       # "-25"

# 불린 → 문자열
print(str(True))      # "True"
print(str(False))     # "False"

# 리스트 → 문자열
print(str([1, 2, 3])) # "[1, 2, 3]"

변환 가능 여부 표

From → To int() float() str()
문자열 “10” ✅ 10 ✅ 10.0 -
문자열 “3.14” ❌ ValueError ✅ 3.14 -
문자열 “hello” ❌ ValueError ❌ ValueError -
정수 10 - ✅ 10.0 ✅ “10”
실수 3.14 ✅ 3 - ✅ “3.14”
불린 True ✅ 1 ✅ 1.0 ✅ “True”

💻 실습 예제

예제 1: 입력받은 숫자 계산

1
2
3
4
5
6
7
8
9
10
# input()은 항상 문자열 반환
num1 = input("첫 번째 숫자: ")  # "10"
num2 = input("두 번째 숫자: ")  # "20"

# 문자열 → 정수 변환
num1 = int(num1)
num2 = int(num2)

print(f"합: {num1 + num2}")      # 30
print(f"차: {num1 - num2}")      # -10

예제 2: 숫자와 문자열 결합

1
2
3
4
5
6
7
8
9
10
11
12
13
age = 25
name = "홍길동"

# ❌ 에러! (정수와 문자열은 + 불가)
# message = name + "의 나이는 " + age

# ✅ 숫자를 문자열로 변환
message = name + "의 나이는 " + str(age)
print(message)  # 홍길동의 나이는 25

# 또는 f-string 사용 (자동 변환)
message = f"{name}의 나이는 {age}"
print(message)

예제 3: 소수점 반올림

1
2
3
4
5
6
7
8
9
10
11
12
score_str = "85.7"

# 문자열 → 실수 → 정수
score_float = float(score_str)  # 85.7
score_int = int(score_float)    # 85

print(f"원래 점수: {score_str}")
print(f"정수로 변환: {score_int}")

# 반올림
score_rounded = round(score_float)  # 86
print(f"반올림: {score_rounded}")

type() 함수로 타입 확인하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
age = 25
name = "홍길동"
score = 3.14
is_student = True

print(type(age))        # <class 'int'>
print(type(name))       # <class 'str'>
print(type(score))      # <class 'float'>
print(type(is_student)) # <class 'bool'>

# isinstance()로 확인
print(isinstance(age, int))     # True
print(isinstance(name, str))    # True
print(isinstance(score, float)) # True

🎯 학습 목표 3: 암시적 변환 알기

자동 타입 변환이란?

암시적 변환 = Python이 자동으로 수행하는 타입 변환

명시적으로 변환하지 않아도, Python이 자동으로 타입을 변환하는 경우가 있습니다.

숫자 연산 시 자동 변환

1
2
3
4
5
6
7
8
# int + float → float
result = 10 + 3.14
print(result)        # 13.14
print(type(result))  # <class 'float'>

# bool + int → int
result = True + 5    # True는 1로 계산
print(result)        # 6

자동 변환 규칙

  1. 정수 + 실수 = 실수: 더 넓은 범위(실수)로 자동 변환
  2. 불린 + 숫자 = 숫자: True는 1, False는 0으로 계산
1
2
3
4
5
6
7
# 정수 + 실수
print(5 + 2.5)     # 7.5 (float)
print(10 * 1.5)    # 15.0 (float)

# 불린 + 정수
print(True + 10)   # 11 (True는 1)
print(False + 10)  # 10 (False는 0)

🎯 학습 목표 4: 변환 시 주의사항 익히기

주의 1: 변환 불가능한 값

모든 값을 모든 타입으로 변환할 수 있는 것은 아닙니다.

변환 실패 케이스

변환 시도 에러 이유
int("hello") ValueError 숫자가 아닌 문자열
int("3.14") ValueError 실수 형식 문자열 (float으로 먼저 변환 필요)
float("abc") ValueError 숫자가 아닌 문자열
int("10.5abc") ValueError 숫자가 아닌 문자 포함
1
2
3
4
5
6
7
8
9
# ❌ 에러 발생!
# int("hello")      # ValueError: invalid literal for int()
# int("3.14")       # ValueError: invalid literal for int()
# float("abc")      # ValueError: could not convert string to float

# ✅ 올바른 방법
print(int("10"))              # OK: 숫자 문자열
print(int(float("3.14")))     # OK: 실수로 먼저 변환
print(float("3.14"))          # OK: 실수 형식 문자열

안전한 변환 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 방법 1: try-except로 에러 처리
user_input = "abc"
try:
    number = int(user_input)
    print(f"변환 성공: {number}")
except ValueError:
    print("숫자로 변환할 수 없습니다!")

# 방법 2: isdigit()로 먼저 확인
user_input = "123"
if user_input.isdigit():
    number = int(user_input)
    print(f"변환 성공: {number}")
else:
    print("숫자가 아닙니다!")

주의 2: 소수점 버림 vs 반올림

중요: int()는 반올림이 아니라 버림(truncation)입니다!

함수 동작 예시
int(9.9) 버림 9 (10 아님!)
int(9.1) 버림 9
round(9.9) 반올림 10
round(9.1) 반올림 9
1
2
3
4
5
6
7
8
9
10
11
12
# int()는 버림 (반올림 아님!)
print(int(9.9))    # 9 (10 아님!)
print(int(9.1))    # 9
print(int(3.7))    # 3
print(int(-2.5))   # -2

# 반올림하려면 round() 사용
print(round(9.9))  # 10
print(round(9.1))  # 9
print(round(3.7))  # 4
print(round(3.5))  # 4
print(round(2.5))  # 2 (짝수로 반올림)

round()의 특별한 규칙

1
2
3
4
5
6
# round()는 "Banker's Rounding" 사용
# 정확히 중간값(.5)일 때는 가장 가까운 짝수로 반올림
print(round(2.5))  # 2 (짝수)
print(round(3.5))  # 4 (짝수)
print(round(4.5))  # 4 (짝수)
print(round(5.5))  # 6 (짝수)

주의 3: 진법 변환

문자열 → 정수 변환 시 진법 지정 가능

진법 사용법 예시
2진법 int("1010", 2) 10
8진법 int("12", 8) 10
16진법 int("A", 16) 10
1
2
3
4
5
6
7
8
9
10
11
# 2진법 문자열 → 정수
binary = "1010"
print(int(binary, 2))  # 10

# 16진법 문자열 → 정수
hex_str = "FF"
print(int(hex_str, 16))  # 255

# 8진법 문자열 → 정수
octal = "17"
print(int(octal, 8))  # 15

주의 4: 리스트/딕셔너리 변환

list()와 str()의 차이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 문자열 → 리스트
text = "hello"
chars = list(text)
print(chars)  # ['h', 'e', 'l', 'l', 'o']

# 리스트 → 문자열 (join 사용!)
chars = ['a', 'b', 'c']
text = ''.join(chars)  # ✅ 올바른 방법
print(text)  # "abc"

# ❌ str()은 리스트를 문자열 표현으로 변환
text = str(chars)
print(text)  # "['a', 'b', 'c']" (원하는 결과 아님!)

# 딕셔너리 키만 리스트로
my_dict = {"a": 1, "b": 2}
keys = list(my_dict.keys())
print(keys)  # ['a', 'b']

# 딕셔너리 값만 리스트로
values = list(my_dict.values())
print(values)  # [1, 2]

주의 5: bool 변환

모든 값은 bool로 변환 가능합니다

bool() 결과 설명
0, 0.0 False 숫자 0
"" False 빈 문자열
[], (), {} False 빈 컬렉션
None False None 값
그 외 모든 값 True Truthy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Falsy 값들 (False로 평가)
print(bool(0))      # False
print(bool(0.0))    # False
print(bool(""))     # False
print(bool([]))     # False
print(bool({}))     # False
print(bool(None))   # False

# Truthy 값들 (True로 평가)
print(bool(1))      # True
print(bool(-1))     # True
print(bool("0"))    # True (문자열 "0"은 True!)
print(bool([0]))    # True (요소가 있는 리스트)
print(bool(" "))    # True (공백이 있는 문자열)

💡 실전 팁 & 주의사항

Tip 1: input()은 항상 문자열

1
2
3
4
5
6
7
# ❌ 실수하기 쉬운 예
age = input("나이: ")  # "25" (문자열)
next_age = age + 1     # TypeError!

# ✅ 올바른 방법
age = int(input("나이: "))  # 25 (정수)
next_age = age + 1          # 26

Tip 2: 숫자와 문자열 합칠 때

1
2
3
4
5
6
7
8
9
# ❌ 에러!
score = 100
message = "점수: " + score  # TypeError!

# ✅ 방법 1: str()로 변환
message = "점수: " + str(score)

# ✅ 방법 2: f-string 사용 (추천)
message = f"점수: {score}"

Tip 3: 실수 문자열을 정수로 변환할 때

1
2
3
4
5
# ❌ 직접 변환 불가
num = int("3.14")  # ValueError!

# ✅ 실수로 먼저 변환 후 정수로
num = int(float("3.14"))  # 3

Tip 4: int()와 round()의 차이

1
2
3
4
5
6
7
# int()는 버림
print(int(3.7))     # 3
print(int(3.2))     # 3

# round()는 반올림
print(round(3.7))   # 4
print(round(3.2))   # 3

Tip 5: type() vs isinstance()

1
2
3
4
5
6
7
8
9
age = 25

# type()로 확인
print(type(age) == int)  # True

# isinstance()로 확인 (더 권장)
print(isinstance(age, int))  # True

# isinstance()가 더 좋은 이유: 상속 관계 고려

🧪 연습 문제

문제 1: 온도 양방향 변환기

과제: 사용자에게 변환 방향을 선택하게 하고, 온도를 양방향(섭씨↔화씨)으로 변환하는 프로그램을 작성하세요.

초기 데이터:

1
2
3
# 변환 공식
# 화씨 = 섭씨 × 1.8 + 32
# 섭씨 = (화씨 - 32) / 1.8

요구사항:

  1. 사용자에게 변환 방향을 선택하도록 입력받기 (“C to F” 또는 “F to C”)
  2. 변환할 온도 값을 입력받기
  3. input()으로 받은 문자열을 float()로 타입 변환하기
  4. 선택한 방향에 따라 적절한 공식으로 변환하기
  5. 결과를 소수점 첫째 자리까지 출력하기
  6. 여러 온도를 테스트하여 결과 확인하기
💡 힌트
  • input() 함수로 받은 값은 항상 문자열이에요!
  • float() 함수를 사용해서 실수로 변환하세요
  • 조건문(if)으로 변환 방향을 구분하세요
  • f-string의 :.1f 포맷으로 소수점 첫째 자리까지 출력할 수 있어요
✅ 정답
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
print("===== 온도 양방향 변환기 =====")

# 변환 방향 선택
direction = input("변환 방향을 선택하세요 (1: 섭씨→화씨, 2: 화씨→섭씨): ")

if direction == "1":
    # 섭씨 → 화씨
    celsius_str = input("섭씨 온도를 입력하세요: ")
    celsius = float(celsius_str)

    fahrenheit = celsius * 1.8 + 32

    print(f"\n결과: {celsius}°C = {fahrenheit:.1f}°F")

elif direction == "2":
    # 화씨 → 섭씨
    fahrenheit_str = input("화씨 온도를 입력하세요: ")
    fahrenheit = float(fahrenheit_str)

    celsius = (fahrenheit - 32) / 1.8

    print(f"\n결과: {fahrenheit}°F = {celsius:.1f}°C")

else:
    print("잘못된 입력입니다.")

print("\n===== 여러 온도 변환 테스트 =====")
# 섭씨 → 화씨 테스트
test_celsius = [0, 25, 100, -40]
print("\n[섭씨 → 화씨]")
for c in test_celsius:
    f = c * 1.8 + 32
    print(f"{c}°C = {f:.1f}°F")

# 화씨 → 섭씨 테스트
test_fahrenheit = [32, 77, 212, -40]
print("\n[화씨 → 섭씨]")
for f in test_fahrenheit:
    c = (f - 32) / 1.8
    print(f"{f}°F = {c:.1f}°C")

출력:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
===== 온도 양방향 변환기 =====
변환 방향을 선택하세요 (1: 섭씨→화씨, 2: 화씨→섭씨): 1
섭씨 온도를 입력하세요: 25

결과: 25.0°C = 77.0°F

===== 여러 온도 변환 테스트 =====

[섭씨 → 화씨]
0°C = 32.0°F
25°C = 77.0°F
100°C = 212.0°F
-40°C = -40.0°F

[화씨 → 섭씨]
32°F = 0.0°C
77°F = 25.0°C
212°F = 100.0°C
-40°F = -40.0°C

문제 2: 점수 데이터 분석 시스템

과제: 공백으로 구분된 점수 문자열을 받아 정수 리스트로 변환하고, 다양한 통계를 계산하는 프로그램을 작성하세요.

초기 데이터:

1
scores_str = "85 92 78 95 88 76 90 82"

요구사항:

  1. split() 메서드로 문자열을 리스트로 분리하기
  2. for 루프로 각 문자열 요소를 int()로 타입 변환하여 새 리스트 만들기
  3. 평균, 최고점, 최저점 계산하기
  4. 80점 이상인 점수의 개수 세기
  5. 모든 점수를 문자열 형태로 다시 변환하여 출력하기
  6. 타입 변환 전후의 데이터 타입을 type() 함수로 확인하기
💡 힌트
  • split() 메서드는 문자열을 공백 기준으로 나눠 리스트로 만들어요
  • 빈 리스트를 만들고 append()로 변환된 값을 추가하세요
  • sum(), len(), max(), min() 함수를 활용하세요
  • str() 함수로 정수를 다시 문자열로 변환할 수 있어요
  • type() 함수로 변수의 타입을 확인할 수 있어요
✅ 정답
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
print("===== 점수 데이터 분석 시스템 =====")

scores_str = "85 92 78 95 88 76 90 82"
print(f"원본 데이터: {scores_str}")
print(f"원본 데이터 타입: {type(scores_str)}")

# 1단계: 문자열 → 문자열 리스트
scores_list = scores_str.split()
print(f"\n분리된 리스트: {scores_list}")
print(f"첫 번째 요소 타입: {type(scores_list[0])}")

# 2단계: 문자열 리스트 → 정수 리스트
scores_int = []
for score in scores_list:
    scores_int.append(int(score))

print(f"\n정수 리스트: {scores_int}")
print(f"첫 번째 요소 타입: {type(scores_int[0])}")

# 3단계: 통계 계산
average = sum(scores_int) / len(scores_int)
max_score = max(scores_int)
min_score = min(scores_int)

# 4단계: 80점 이상 개수 세기
high_scores = 0
for score in scores_int:
    if score >= 80:
        high_scores += 1

print(f"\n===== 분석 결과 =====")
print(f"총 점수 개수: {len(scores_int)}")
print(f"평균 점수: {average:.2f}")
print(f"최고 점수: {max_score}")
print(f"최저 점수: {min_score}")
print(f"80점 이상: {high_scores}개 ({high_scores/len(scores_int)*100:.1f}%)")

# 5단계: 정수 → 문자열 변환 (역변환)
scores_str_converted = []
for score in scores_int:
    scores_str_converted.append(str(score))

print(f"\n문자열로 재변환: {scores_str_converted}")
print(f"첫 번째 요소 타입: {type(scores_str_converted[0])}")

# 추가 테스트: 다른 데이터
print("\n===== 추가 테스트 =====")
test_data = ["90 85 88", "100 95 92 88 85", "75 80 85 90 95 100"]

for data in test_data:
    scores = [int(s) for s in data.split()]  # 간단한 방법 (참고용)
    avg = sum(scores) / len(scores)
    print(f"데이터: {data}")
    print(f"  → 평균: {avg:.2f}점, 최고: {max(scores)}점, 최저: {min(scores)}\n")

출력:

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
===== 점수 데이터 분석 시스템 =====
원본 데이터: 85 92 78 95 88 76 90 82
원본 데이터 타입: <class 'str'>

분리된 리스트: ['85', '92', '78', '95', '88', '76', '90', '82']
첫 번째 요소 타입: <class 'str'>

정수 리스트: [85, 92, 78, 95, 88, 76, 90, 82]
첫 번째 요소 타입: <class 'int'>

===== 분석 결과 =====
총 점수 개수: 8개
평균 점수: 85.75점
최고 점수: 95점
최저 점수: 76점
80점 이상: 6개 (75.0%)

문자열로 재변환: ['85', '92', '78', '95', '88', '76', '90', '82']
첫 번째 요소 타입: <class 'str'>

===== 추가 테스트 =====
데이터: 90 85 88
  → 평균: 87.67점, 최고: 90점, 최저: 85점

데이터: 100 95 92 88 85
  → 평균: 92.00점, 최고: 100점, 최저: 85점

데이터: 75 80 85 90 95 100
  → 평균: 87.50점, 최고: 100점, 최저: 75점

🎯 연습 문제 핵심 포인트

문제 1에서 배운 것:

  • input() 함수로 받은 문자열을 float()로 실수 변환하기
  • 타입 변환이 필요한 이유 이해하기 (문자열로는 수학 연산 불가)
  • 양방향 변환 로직 구현하기
  • f-string 포맷 :.1f로 소수점 자리 제어하기

문제 2에서 배운 것:

  • split() 메서드로 문자열을 리스트로 분리하기
  • for 루프로 각 요소를 int()로 일괄 변환하기
  • 타입 변환 전후를 type() 함수로 확인하기
  • 통계 계산을 위해 문자열을 숫자로 변환하는 실전 패턴
  • 역변환(intstr)을 통해 타입 변환의 양방향성 이해하기

📝 오늘 배운 내용 정리

  1. 타입 변환 개념: 한 자료형을 다른 자료형으로 변환하는 것
  2. 명시적 변환: int(), float(), str() 함수를 사용한 직접 변환
  3. 암시적 변환: Python이 자동으로 수행하는 타입 변환 (정수+실수→실수)
  4. 주의사항: 변환 불가능한 값, 소수점 버림, 리스트/딕셔너리 변환
  5. 실전 활용: input() 처리, 숫자와 문자열 결합, 타입 확인

🔗 관련 자료


📚 이전 학습

Day 14: 불린 (bool) - 참과 거짓

어제는 불린(bool)으로 참/거짓을 다루는 방법을 배웠습니다!

📚 다음 학습

Day 16: 문자열 포맷팅 (f-string) ⭐⭐

내일은 문자열을 다양한 방법으로 포맷팅하는 방법을 배웁니다!


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

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