도찐개찐

[python] 형변환(casting) 본문

PYTHON

[python] 형변환(casting)

도개진 2022. 7. 12. 09:29

파이썬에서 데이터의 형을 변환 (type case) 방법에 대하여 알아보겠습니다.

기본적 데이터 형에 대한 형 변환 (type case)은 다음과 같습니다.

  • 문자열 변환 = str()
  • 불리언 변환 = bool()
  • 정수 변환 = int()
  • 실수 변환 = float()
  • 문자 변환 = chr()

위 형변환 중에서 str(), bool() 두 경우는 어떤한 값을 넣어도 해당 데이터 형으로 변환이 되어 버리는 강력한 기능을 갖고 있으나, 나머지 int(), float(), chr() 변환 함수에는 변환이 가능하지 않은 데이터를 입력하게 되면, "ValueError"가 발생하게 됩니다. 이 부분을 유념하여 try ... except ... 예외 처리가 반드시 필요합니다.

순차적으로 데이터 형 변환(type cast)에 대하여 살펴 보도록 하겠습니다.


문자열 변환 = str()

어떠한 데이터를 입력하여도 문자열로 변환하여 줍니다.

다음 예제와 그 결과를 보시면 쉽게 이해되실 겁니다.

# 문자열로 데이터 형 변환 예제 : type case to string
from io import StringIO
import numpy as np

# str(int) : 정수를 문자열로 변환
int_str = str(1234)
print(f'str(1234) = {int_str} ; type(int_str) = {type(int_str)}')

# str(float) : 실수를 문자열로 변환
float_str = str(1234.5678)
print(f'str(1234.5678) = {float_str} ; type(float_str) = {type(float_str)}')

# str(bool) : 불리언을 문자열로 변환
true_str = str(True)
print(f'str(True) = {true_str} ; type(true_str) = {type(true_str)}')
false_str = str(False)
print(f'str(False) = {false_str} ; type(false_str) = {type(false_str)}')

# str(char) : 문자를 문자열로 변환
H_str = str('H')
print(f'str("H") = {H_str} ; type(H_str) = {type(H_str)}')
h_str = str('h')
print(f'str("h") = {h_str} ; type(h_str) = {type(h_str)}')

# str(class) : 객체를 문자열로 변환
points = np.loadtxt(StringIO('158 232\n356 232\n550 232\n158 321\n356 321\n550 321\n158 409\n356 409\n550 409'))
str_points = str(points)
print(f'str(points) = {str_points} ; type(points) = {type(points)}')

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

str(1234) = 1234 ; type(int_str) = <class 'str'>
str(1234.5678) = 1234.5678 ; type(float_str) = <class 'str'>
str(True) = True ; type(true_str) = <class 'str'>
str(False) = False ; type(false_str) = <class 'str'>
str("H") = H ; type(H_str) = <class 'str'>
str("h") = h ; type(h_str) = <class 'str'>
str(points) = [[158. 232.]
 [356. 232.]
 [550. 232.]
 [158. 321.]
 [356. 321.]
 [550. 321.]
 [158. 409.]
 [356. 409.]
 [550. 409.]] ; type(points) = <class 'numpy.ndarray'>

불리언 변환 = bool()

불리언 형으로 변환하는 bool()도 str()과 유사하게 입력된 모든 값에 따라 bool 값으로 형 변환됩니다.

숫자형 데이터를 입력한 경우, 0이면 False를 그 외에는 True로 변환됩니다.
문자열을 입력한 경우에는 공백 문자열이면 False를, 그 외에는 True로 변환됩니다.

아래 예제를 통하여 변환 결과를 확인해 보시면 좀 더 명확하게 이해하실 수 있습니다.

# 불리언으로 데이터 형 변환 예제 : type case to bool

# bool(int)
int_bool = bool(1234)
print(f'bool(1234) = {int_bool} ; type(int_bool) = {type(int_bool)}')
zero_bool = bool(0)
print(f'bool(0) = {zero_bool} ; type(zero_bool) = {type(zero_bool)}')

# bool(float)
float_bool = bool(1234.5678)
print(f'bool(1234.5678) = {float_bool} ; type(float_bool) = {type(float_bool)}')
float_zero_bool = bool(0.00)
print(f'bool(0.00) = {float_zero_bool} ; type(float_zero_bool) = {type(float_zero_bool)}')

# bool(bool)
true_bool = bool(True)
print(f'bool(True) = {true_bool} ; type(true_bool) = {type(true_bool)}')
false_bool = bool(False)
print(f'bool(False) = {false_bool} ; type(false_bool) = {type(false_bool)}')

# bool(str)
not_empty_str_bool = bool('not empty')
print(f'bool(\'not empty\') = {not_empty_str_bool}, type(not_empty_str_bool) = {type(not_empty_str_bool)}')
empty_str_bool = bool('')
print(f'bool(\'\') = {empty_str_bool}, type(empty_str_bool) = {type(empty_str_bool)}')

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

bool(1234) = True ; type(int_bool) = <class 'bool'>
bool(0) = False ; type(zero_bool) = <class 'bool'>
bool(1234.5678) = True ; type(float_bool) = <class 'bool'>
bool(0.00) = False ; type(float_zero_bool) = <class 'bool'>
bool(True) = True ; type(true_bool) = <class 'bool'>
bool(False) = False ; type(false_bool) = <class 'bool'>
bool('not empty') = True, type(not_empty_str_bool) = <class 'bool'>
bool('') = False, type(empty_str_bool) = <class 'bool'>

정수 변환 = int()

정수형으로 형 변환을 할 때는 입력한 데이터에 따라서 "ValueError" 오류가 발생할 수 있기 때문에, try ... except ... 를 통하여 반드시 예외 처리를 해야만 합니다.

아래 예제에서 이 부분을 확인해 보시기 바랍니다.

# 정수로 데이터 형 변환 예제 : type case to int

# int(float)
float_int = int(1234.5678)
print(f'int(1234.5678) = {float_int} ; type(float_int) = {type(float_int)}')

# int(bool)
true_int = int(True)
false_int = int(False)
print(f'int(True) = {true_int}, int(False) = {false_int}')

# int(number str)
str_int = int('1234')
print(f'int("1234") = {str_int} ; type(str_int) = {type(str_int)}')
# str_int = int('1234.5678') # ValueError: invalid literal for int() with base 10: '1234.5678'

# int(not number str)
# value_error_str = int('abcdefg') # ValueError: invalid literal for int() with base 10: 'abcdefg'
try:
    value_error_str = int('abcdefg')
except:
    print('int(\'abcdefg\') # ValueError')

정수 문자열을 정수형으로 변환하는 것은 되지만, 실수 문자열을 정수형으로 변환하려고 하면 위 예제와 같이 "ValueError"가 발생합니다. 또한 정수 문자열이 아닌 일반 다른 문자열들도 변환이 불가능하기 때문에 "ValueError"가 발생하게 됩니다.

프로그램이 실행 중간에 "ValueError" 등으로 갑작스럽게 중단되는 것을 막기 위해서는 앞서 말씀드린 것과 같이 위 예제에서와 같이 반드시 try ... except ... 구문으로 예외 데이터에 대한 처리를 해두셔야만 합니다.

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

int(1234.5678) = 1234 ; type(float_int) = <class 'int'>
int(True) = 1, int(False) = 0
int("1234") = 1234 ; type(str_int) = <class 'int'>
int('abcdefg') # ValueError

실수 변환 = float()

실수형으로 형 변환을 할 때도 int() 형 변환과 유사하게 입력한 데이터에 따라서 "ValueError" 오류가 발생할 수 있기 때문에, try ... except ... 를 통하여 반드시 예외 처리를 해야만 합니다.

int() 형변환과 다른 점은 "1234.5678" 과 같은 실수 문자열을 int() 형으로 변환할 때는 "ValueError"가 발생하였었지만, float()에서는 해당 실수값으로 형변환이 된다는 점입니다.

아래 예제에서 이 부분을 확인해 보시기 바랍니다.

# 실수로 데이터 형 변환 예제 : type case to float

# float(int)
int_float = float(1234)
print(f'float(1234) = {int_float}, type(int_float) = {type(int_float)}')

# float(bool)
true_float = float(True)
false_float = float(False)
print(f'float(True) = {true_float}, float(False) = {false_float}')

# float(number str)
int_str_float = float('1234')
print(f'float("1234") = {int_str_float} ; type(int_str_float) = {type(int_str_float)}')
float_str_int = float('1234.5678')
print(f'float("1234.5678") = {float_str_int} ; type(float_str_int) = {type(float_str_int)}')

# float(not number str)
# value_error_str = float('abcdefg') # ValueError: could not convert string to float: 'abcdefg'
try:
    value_error_str = float('abcdefg')
except:
    print('int(\'abcdefg\') # ValueError')

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

float(1234) = 1234.0, type(int_float) = <class 'float'>
float(True) = 1.0, float(False) = 0.0
float("1234") = 1234.0 ; type(int_str_float) = <class 'float'>
float("1234.5678") = 1234.5678 ; type(float_str_int) = <class 'float'>
int('abcdefg') # ValueError

문자 변환 = chr()

데이터를 문자로 형변환할 때는 chr()을 이용합니다. 입력할 수 있는 데이터는 정수형으로 한정되어 있어서 그 외의 데이터를 입력하면 "TypeError" 오류가 발생합니다. 앞서 살펴본 int(), float()와 마찬가지로 반드시 try ... except ... 구분을 이용하여 "TypeError"에 대한 예외처리를 해야만 합니다.

불리언 데이터의 경우 정수형 1과 0으로 자동으로 변환되어 형변환이 이루어집니다.

다음 예제에서 이를 확인해 볼 수 있습니다.

# 문자로 데이터 형 변환 예제 : type case to chr

# chr(int)
A_chr = chr(65)
print(f'chr(65) = {A_chr} ; type(a) = {type(A_chr)}')
B_chr = chr(66)
print(f'chr(66) = {B_chr} ; type(b) = {type(B_chr)}')

# chr(bool) : same int 1 (True), int 0 (False)
true_chr = chr(True)
int1_chr = chr(1)
if true_chr == int1_chr:
    print('chr(True) == chr(1)')
false_chr = chr(False)
int0_chr = chr(0)
if false_chr == int0_chr:
    print('chr(False) == chr(0)')

# chr(float) # occured TypeError
# float_chr = chr(1234.5678) # TypeError: integer argument expected, got float
# chr(str) # occured TypeError
# str_chr = chr('abcdefg') # TypeError: an integer is required (got type str)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

chr(65) = A, type(a) = <class 'str'>
chr(66) = B, type(b) = <class 'str'>
chr(True) == chr(1)
chr(False) == chr(0)

지금까지 파이썬에서 형변환하는 str(), bool(), int(), float(), chr() 를 살펴 보았습니다.

 

거듭 강조하자면, int(), float(), chr()로 형변환할 때는 반드시 try ... except... 구문으로 예외 데이터에 대한 처리 (기본값 할당 등)를 해어야 의도치 않게 프로그램이 종료되는 문제를 막을 수 있습니다.

 

참고로 boo()로 형변환 시, bool("False")는 False로 형변환되지 않습니다.

 

출처: https://hbesthee.tistory.com/1728 [채윤이네집:티스토리]

728x90

'PYTHON' 카테고리의 다른 글

[python] 수학(math) 함수  (0) 2022.07.12
[python] 수치 연산 함수  (0) 2022.07.12
[python] 연산자(operator)  (0) 2022.07.11
[python] 사칙 연산자  (0) 2022.07.11
[python] 삼항 연산자(Ternary operator)  (0) 2022.07.11
Comments