프로그래밍 관점에서 형변환이란 하나의 타입을 다른 타입으로 변환하는 것을 의미한다.
파이썬 타입 캐스팅은 하나의 데이터 타입의 리터럴을 다른 데이터 타입으로 변환하는 프로세스다.
파이썬은 두 가지 유형의 캐스팅, 즉 묵시적 캐스팅과 명시적 캐스팅을 지원한다.
파이썬에는 숫자, 시퀀스, 매핑 등과 같은 다양한 데이터 유형이 있다.
하나의 유형의 사용 가능한 데이터가 있지만 다른 형식으로 사용하고 싶은 상황이 발생할 수 있다.
예를 들어 사용자가 문자열을 입력했지만 숫자로 사용하고 싶다면 파이썬의 타입 캐스팅 메커니즘을 사용할 수 있다.
목차
1. 묵시적 형변환
2. 명시적 형변환
3. int() 함수
3-1. 문자열을 정수로 변환
3-2. 2진수를 정수로 변환
3-3. 8진수를 정수로 변환
3-4. 16진수를 정수로 변환
4. float() 함수
5. str() 함수
5-1. 정수를 문자열로 변환
5-2. 부동 소수점을 문자열로 변환
6. 시퀀스 유형 변환
7. 데이터 유형 변환 기능
파이썬에서 묵시적 캐스팅이란 언어의 컴파일러/인터프리터가 자동으로 하나의 유형의 객체를 다른 유형으로 변환하는 것을 의미한다.
파이썬은 강력한 형식의 언어다. 관련 없는 데이터 유형 간에는 자동 형 변환이 허용되지 않는다.
예를 들어, 문자열은 어떤 숫자 유형으로도 변환될 수 없다.
그러나 정수는 부동 소수점으로 형 변환될 수 있다.
다른 언어 중에서는 JavaScript가 있다.
JavaScript는 약한 형식의 언어로 정수를 문자열로 강제 형변환하여 연결할 수 있다.
각 데이터 유형의 메모리 요구 사항이 다르다는 것에 유의해야 한다.
예를 들어, 파이썬의 정수 객체는 4바이트의 메모리를 차지하고, 부동 소수점 객체는 소수 부분 때문에 8바이트가 필요하다.
따라서 파이썬 인터프리터는 소수를 정수로 자동으로 변환하지 않는다.
왜냐하면 이렇게 하면 데이터의 손실이 발생할 수 있기 때문이다.
반면에 int는 소수 부분을 0으로 설정하여 쉽게 float로 변환될 수 있다.
암시적 int에서 float로의 캐스팅은 int 및 float 피연산자에 대한 산술 연산이 수행될 때 발생한다.
정수 및 부동 소수점 변수를 갖는 경우
<<< a=10 # int object
<<< b=10.5 # float object
두 수를 더하기 위해 10 - 정수 객체는 10.0으로 업그레이드된다.
이것은 float이지만 이전의 숫자 값과 동등하다.
이제 두 float의 덧셈을 수행할 수 있다.
<<< c=a+b
<<< print (c)
20.5
묵시적 형변환에서는 작은 바이트 크기의 파이썬 객체가 연산에서 다른 객체의 큰 바이트 크기와 일치하도록 업그레이드된다.
예를 들어, 불리언 객체는 먼저 int로 업그레이드되고 그런 다음 float로 업그레이드되어 부동 소수점 객체와 더해진다.
다음 예에서는 부동 소수점에 부울 객체를 추가하려고 시도한다.
True는 1과 같으며, False는 0과 같다.
# 묵시적 형변환 예시
a=True;
b=10.5;
c=a+b;
print (c);
# 묵시적 형변환 예시 결과
11.5
묵시적 형변환이 int를 float로 변환하는 데로 제한되어 있지만 파이썬의 내장 함수 int() 및 float(), str()을 사용하여 문자열에서 정수로와 같은 명시적 변환을 수행할 수 있다.
x = int(1) # x will be 1
y = int(2.8) # y will be 2
x = float(1) # x will be 1.0
y = float(2.8) # y will be 2.8
z = float("3") # z will be 3.0
w = float("4.2") # w will be 4.2
x = str("s1") # x will be 's1'
y = str(2) # y will be '2'
z = str(3.0) # z will be '3.0'
파이썬의 내장 int() 함수는 정수 리터럴을 정수 객체로, 부동 소수점을 정수로, 그리고 문자열이 유효한 정수 리터럴 표현을 가지고 있다면 문자열을 정수로 변환한다.
int()를 int 객체와 함께 사용하는 것은 직접 int 객체를 선언하는 것과 동등합니다.
<<< a = int(10)
<<< a
10
위는 아래와 같다.
<<< a = 10
<<< a
10
<<< type(a)
<class 'int>
int() 함수에 전달된 인수가 부동 소수점 객체나 부동 소수점 표현식인 경우 int 객체를 반환한다.
<<< a = int(10.5) #converts a float object to int
<<< a
10
<<< a = int(2*3.14) #expression results float, is converted to int
<<< a
6
<<< type(a)
<class 'int'>
int() 함수는 인수로 Boolean 객체가 주어지면 정수 1을 반환한다.
<<< a=int(True)
<<< a
1
<<< type(a)
<class 'int'>
int() 함수는 문자열 객체로부터 정수를 반환한다.
단, 해당 문자열이 유효한 정수 표현을 포함하는 경우에만 가능하다.
<<< a = int("100")
<<< a
100
<<< type(a)
<class 'int'>
<<< a = ("10"+"01")
<<< a = int("10"+"01")
<<< a
1001
<<< type(a)
<class 'int'>
그러나 문자열에 정수가 아닌 표현이 포함되어 있으면 파이썬에서는 ValueError가 발생한다.
<<< a = int("10.5")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '10.5'
<<< a = int("Hello World")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Hello World'
int() 함수는 또한 2진수, 8진수 및 16진수 문자열에서 정수를 반환한다.
이를 위해서는 함수가 각각 2, 8 또는 16이어야 하는 기본(base) 매개변수가 필요하다.
문자열은 유효한 2진수/8진수/16진수 표현이어야 한다.
문자열은 1과 0으로만 이루어져 있어야 하며, 기본(base)은 2여야 한다.
<<< a = int("110011", 2)
<<< a
51
2진수 110011의 10진수 값은 51이다.
8진수 문자열은 0에서 7까지의 숫자만을 포함해야 하며, 기수는 8이어야 한다.
<<< a = int("20", 8)
<<< a
16
8진수 20의 10진수 값은 8이다.
문자열에는 0에서 9 및 A, B, C, D, E 또는 F만 포함되어야 하며, 기수는 16이어야 한다.
<<< a = int("2A9", 16)
<<< a
681
Hexadecimal 2A9의 십진 등가물은 681이다.
이러한 변환을 Windows, Ubuntu 또는 스마트폰의 계산기 앱을 사용하여 쉽게 확인할 수 있다.
다음은 숫자, 부동 소수점 및 문자열을 정수 데이터 유형으로 변환하는 예다.
a = int(1) # a will be 1
b = int(2.2) # b will be 2
c = int("3") # c will be 3
print (a)
print (b)
print (c)
float() 함수는 파이썬 내장 함수로, 인자가 부동 소수점 리터럴, 정수 또는 유효한 부동 소수점 표현을 갖고 있다면 부동 소수점 객체를 반환한다.
# 부동 소수점 리터럴을 사용한 경우
float_number = float(3.14)
# 정수를 사용한 경우
integer_number = float(5)
# 유효한 부동 소수점 표현을 갖는 문자열을 사용한 경우
string_number = float("7.5")
float() 함수를 부동 소수점 객체를 인자로 사용하는 경우, 이는 부동 소수점 객체를 직접 선언하는 것과 동등하다.
아래 두 코드는 같다.
<<< a = float(9.99)
<<< a
9.99
<<< type(a)
<class 'float'>
<<< a = 9.99
<<< a
9.99
<<< type(a)
<class 'float'>
float() 함수에 정수가 인자로 주어진 경우, 반환된 값은 소수 부분이 0인 부동 소수점이다.
<<< a = float(100)
<<< a
100.0
<<< type(a)
<class 'float'>
float() 함수는 문자열이 유효한 부동 소수점 숫자를 포함하고 있다면 해당 문자열에서 부동 소수점 객체를 반환하며, 그렇지 않으면 ValueError가 발생한다.
<<< a = float("9.99")
<<< a
9.99
<<< type(a)
<class 'float'>
<<< a = float("1,234.50")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: '1,234.50'
이 부분의 ValueError의 원인은 문자열에 쉼표가 있기 때문이다.
문자열에서 부동 소수점으로의 변환을 위해 부동 소수점의 과학적 표기법도 유효하게 고려된다.
<<< a = float("1.00E4")
<<< a
10000.0
<<< type(a)
<class 'float'>
<<< a = float("1.00E-4")
<<< a
0.0001
<<< type(a)
<class 'float'>
다음은 숫자, 부동 소수점 및 문자열을 부동 소수점 데이터 유형으로 변환하는 예제다.
a = float(1) # a will be 1.0
b = float(2.2) # b will be 2.2
c = float("3.3") # c will be 3.3
print (a)
print (b)
print (c)
str() 함수는 정수 또는 부동 소수점 수를 따옴표(')로 둘러싸서 str 개체를 반환한다.
str() 함수는 파이썬 객체의 문자열 표현을 반환한다.
str() 함수에는 세 개의 매개변수가 있다.
첫 번째 필수 매개변수(또는 인수)는 문자열 표현을 원하는 객체다.
두 번째와 세 번째 매개변수, encoding 및 errors는 선택 사항이다.
파이썬 콘솔에서 str() 함수를 실행하여 반환된 개체가 따옴표(')로 둘러싸인 문자열임을 쉽게 확인할 수 있다.
임의의 정수를 다음과 같이 문자열로 변환할 수 있다.
<<< a = str(10)
<<< a
'10'
<<< type(a)
<class 'str'>
str () 함수는 부동 소수점 표기법, 정수와 분수를 구분하는 소수점 표기법, 과학적 표기법을 모두 사용하여 부동 소수점 객체를 문자열 객체로 변환한다.
<<< a=str(11.10)
<<< a
'11.1'
<<< type(a)
<class 'str'>
<<< a = str(2/5)
<<< a
'0.4'
<<< type(a)
<class 'str'>
두 번째 경우에는 나눗셈 식을 str() 함수에 인수로 부여한다.
먼저 식을 평가한 후 결과를 문자열로 변환한다는 점에 유의해야 한다.
E 또는 e를 사용하고 양 또는 음의 거듭제곱을 갖는 과학적 주석의 부동 소수점은 str() 함수를 갖는 문자열로 변환된다.
<<< a=str(10E4)
<<< a
'100000.0'
<<< type(a)
<class 'str'>
<<< a=str(1.23e-4)
<<< a
'0.000123'
<<< type(a)
<class 'str'>
불린 상수가 인수로 입력되면 True가 'True'로 반환된다.
또한 리스트 및 튜플 객체도 str() 함수에 인수로 제공할 수 있다.
결과 문자열은 리스트/튜플이 '로 둘러싸인 형태다.
<<< a=str('True')
<<< a
'True'
<<< a=str([1,2,3])
<<< a
'[1, 2, 3]'
<<< a=str((1,2,3))
<<< a
'(1, 2, 3)'
<<< a=str({1:100, 2:200, 3:300})
<<< a
'{1: 100, 2: 200, 3: 300}'
# 부동 소수점을 문자열로 변환 예시
a = str(1) # a will be "1"
b = str(2.2) # b will be "2.2"
c = str("3.3") # c will be "3.3"
print (a)
print (b)
print (c)
리스트, 튜플 및 문자열은 파이썬의 시퀀스 유형이다.
이들은 순서가 있는 또는 색인이 지정된 항목의 컬렉션이다.
문자열 및 튜플은 list() 함수를 사용하여 리스트 객체로 변환할 수 있다.
마찬가지로, tuple() 함수는 문자열이나 리스트를 튜플로 변환한다.
<<< a=[1,2,3,4,5] # List Object
<<< b=(1,2,3,4,5) # Tupple Object
<<< c="Hello" # String Object
### list() separates each character in the string and builds the list
<<< obj=list(c)
<<< obj
['H', 'e', 'l', 'l', 'o']
### The parentheses of tuple are replaced by square brackets
<<< obj=list(b)
<<< obj
[1, 2, 3, 4, 5]
### tuple() separates each character from string and builds a tuple of characters
<<< obj=tuple(c)
<<< obj
('H', 'e', 'l', 'l', 'o')
### square brackets of list are replaced by parentheses.
<<< obj=tuple(a)
<<< obj
(1, 2, 3, 4, 5)
### str() function puts the list and tuple inside the quote symbols.
<<< obj=str(a)
<<< obj
'[1, 2, 3, 4, 5]'
<<< obj=str(b)
<<< obj
'(1, 2, 3, 4, 5)'
파이썬의 명시적인 유형 캐스팅 기능은 내장된 기능을 통해 한 데이터 유형을 다른 데이터 유형으로 변환할 수 있다.
한 데이터 유형에서 다른 데이터 유형으로 변환을 수행하기 위한 몇 가지 내장 함수가 있다.
이 함수들은 변환된 값을 나타내는 새로운 개체를 반환한다.
int(x [,base])
x를 정수로 변환한다. x가 문자열인 경우 base는 x의 기수를 지정한다.
long(x [,base] )
x를 긴 정수로 변환한다. x가 문자열인 경우 base는 x의 기수를 지정한다.
float(x)
x를 부동 소수점 숫자로 변환한다.
complex(real [,imag])
복소수를 생성한다.
str(x)
객체 x를 문자열 표현으로 변환한다.
repr(x)
객체 x를 표현 문자열로 변환한다.
eval(str)
문자열을 평가하고 객체를 반환한다.
tuple(s)
s를 튜플로 변환한다.
list(s)
s를 리스트로 변환한다.
set(s)
s를 세트로 변환한다.
dict(d)
딕셔너리를 생성한다. d는 (키, 값) 튜플의 시퀀스여야 한다.
frozenset(s)
s를 동결된 세트로 변환한다.
chr(x)
정수를 문자로 변환한다.
unichr(x)
정수를 유니코드 문자로 변환한다.
ord(x)
단일 문자를 해당 정수 값으로 변환한다.
hex(x)
정수를 16진수 문자열로 변환한다.
oct(x)
정수를 8진수 문자열로 변환한다.
참조 1. tutorialspoint, 「Python - Type Casting」, tutorialspoint 사이트
참조 2. w3schools, 「Python Casting」, w3schools 사이트