courses
Python의 모든 값에는 데이터 타입이 있습니다. 데이터 타입은 데이터를 어떻게 사용할지 컴파일러나 인터프리터에 알려 주는 데이터의 분류입니다. 타입은 데이터에 수행할 수 있는 연산과 데이터를 저장할 구조를 정의합니다. 데이터 과학에서는 데이터를 더 쉽게 사용하고 다루기 위해 타입을 변경해야 하는 일이 자주 있습니다.
Python에는 다양한 데이터 타입이 있습니다. 이미 몇 가지는 보았고 사용해 보셨을 겁니다. 정수와 실수는 수치 값을, 불리언(bool)은 참/거짓 값을, 문자열은 영숫자 문자를 다루는 데 사용합니다. 값의 모음을 저장하는 데이터 구조로는 리스트, 튜플, 딕셔너리, 세트가 있습니다. 더 자세히 알아보려면 DataCamp의 Data Types in Python 과정을 확인하세요.
이 튜토리얼의 예제 코드를 직접 쉽게 실행해 보려면, Python이 미리 설치되어 있고 모든 코드 샘플이 포함된 DataLab 워크북을 무료로 생성하세요.
Python에서 데이터 타입 확인하기
형 변환에 앞서 타입을 확인하면 유용합니다. Python은 두 가지 주요 함수를 제공합니다:
type(): 변수의 타입을 반환합니다.isinstance(): 변수가 특정 타입에 속하는지 확인합니다.
a = 5.5
print(type(a)) # Output: <class 'float'>
print(isinstance(a, int)) # Output: False
print(isinstance(a, float)) # Output: True
Python의 묵시적 및 명시적 데이터 형 변환
Python에서 형 변환은 두 가지 방식으로 일어납니다. 컴파일러에 어떤 타입으로 변환할지 명시적으로 지시하거나, 컴파일러가 스스로 이를 이해하고 변환을 수행하는 방식입니다. 전자는 명시적 데이터 형 변환이고, 후자는 묵시적 데이터 형 변환입니다.
Python 묵시적 데이터 형 변환
묵시적 변환(또는 강제 변환, coercion)은 컴파일 시 또는 실행 시에 형 변환이 일어나며 Python이 이를 자동으로 처리하는 경우를 말합니다. 예제를 보겠습니다:
a_int = 1
b_float = 1.0
c_sum = a_int + b_float
print(c_sum)
print(type(c_sum))
2.0
<class 'float'>
팁: Python에서 type() 함수를 사용해 객체의 데이터 타입을 확인할 수 있습니다.
이 예제에서는 정수 값 a_int에 실수 값 b_float를 더했고, 결과는 별도의 지시 없이 자동으로 실수 값 c_sum으로 변환되었습니다. 이것이 묵시적 형 변환입니다.
왜 실수 값을 정수로 변환하지 않았을까요?
이는 컴퓨터 과학에서 더 넓게 쓰이는 타입 승격(type promotion) 개념 때문입니다. 간단히 말해, 정보 손실 없이 가능한 한 연산을 수행할 수 있도록 데이터를 더 상위 타입으로 변환하는 컴파일러의 방어 메커니즘입니다.
즉, 실수를 정수로 바꾸면 소수 부분을 버려야 하므로 정보가 손실되어 그런 변환은 수행하지 않습니다.
Python 명시적 데이터 형 변환
명시적 데이터 형 변환(타입 캐스팅)은 한 데이터 타입의 값을 다른 타입으로 의도적으로 변환할 때 발생합니다. 이 방식은 코드에서 대상 데이터 타입을 명시하기 때문에 변환을 직접 제어할 수 있습니다. Python의 자동(묵시적) 변환이 요구 사항을 충족하지 못할 때 흔히 사용됩니다.
명시적 변환의 문법은 다음과 같습니다:
target_data_type(expression)
예를 들어, 부동소수점을 정수로 변환하려면 다음과 같이 작성합니다:
int(3.14) # Converts 3.14 to 3
주의: 명시적 변환은 매우 유용하지만 정보 손실을 초래할 수 있습니다. 예를 들어, 부동소수점을 정수로 변환하면 소수 부분이 버려집니다. 의도치 않은 결과를 피하려면 이러한 결과를 이해하는 것이 중요합니다.
이제 자주 사용하는 명시적 데이터 형 변환을 살펴보겠습니다.
Python의 기본형과 비기본형 데이터 구조
기본형 데이터 구조는 데이터 조작의 구성 요소로, 순수하고 단순한 데이터 값을 담습니다. Python에는 네 가지 기본 변수 타입이 있습니다:
- 정수
- 실수
- 문자열
- 불리언
비기본형 데이터 구조는 단일 값이 아니라 다양한 형식의 값 모음을 저장합니다. Python의 비기본형 데이터 구조는 다음과 같습니다:
- 리스트
- 튜플
- 딕셔너리
- 세트
자세한 내용은 DataCamp의 Data Structures in Python Tutorial을 참고하세요.
기본형 데이터 구조 변환
Python 정수와 실수 변환
정수와 실수는 숫자를 다루는 데이터 타입입니다.
정수를 실수로 변환하려면 Python의 float() 함수를 사용하세요. 마찬가지로 실수를 정수로 변환하려면 int() 함수를 사용할 수 있습니다.
a_int = 3
b_int = 2
# Explicit type conversion from int to float
c_float_sum = float(a_int + b_int)
print(c_float_sum)
5.0
a_float = 3.3
b_float = 2.0
# Explicit type conversion from float to int
c_int_sum = int(a_float + b_float)
print(c_int_sum)
c_float_sum = a_float + b_float
print(c_float_sum)
5
5.3
실수 정밀도 이슈와 Decimal 모듈
Python의 부동소수점 연산은 정밀도 문제를 일으킬 수 있습니다:
print(0.1 + 0.2) # Output: 0.30000000000000004
이를 피하려면 Decimal 모듈을 사용하세요:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # Output: 0.3
Python 실수에서 복소수로의 형 변환
complex(real,imag)을 사용해 정수를 복소수로 변환할 수 있습니다. 실수부와 허수부 두 정수가 필요하며, 실수 값을 복소수로 변환합니다.
real = 2
imag = 5
print(complex(real, imag))
(2+5j)
Python 문자열과의 데이터 형 변환
문자열은 하나 이상의 문자(문자, 숫자, 기호)의 모음입니다. 문자열을 숫자로, 또는 숫자를 문자열로 변환해야 하는 경우가 자주 있습니다.
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + total + "$")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-54bd76b9b4bd> in <module>()
2 price_cookie = 6
3 total = price_cake + price_cookie
----> 4 print("The total is: " + total + "$")
TypeError: Can't convert 'int' object to str implicitly
위 예제는 TypeError를 발생시키며, 컴파일러가 정수 값을 문자열로 묵시적으로 변환할 수 없음을 알려 줍니다.
프로그램이 여기서 무엇을 해야 할지는 직관적일 수 있습니다. 그러나 컴파일러가 항상 확신할 수는 없으므로, 원하는 바를 명확히 지정할 수 있도록 명시적 타입 캐스팅 메커니즘을 제공합니다. 다음은 str() 함수를 사용해 정수를 문자열로 변환하는 방법입니다:
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + str(total) + "$")
The total is: 21$
실수를 문자열로 변환할 때도 동일하게 동작합니다.
Python에서는 가능하다면 문자열을 정수 및 실수로도 변환할 수 있습니다. 무슨 의미인지 살펴보겠습니다:
price_cake = '15'
price_cookie = '6'
# String concatenation
total = price_cake + price_cookie
print("The total is: " + total + "$")
# Explicit type conversion to integer
total = int(price_cake) + int(price_cookie)
print("The total is: " + str(total) + "$")
The total is: 156$
The total is: 21$
이제 코드를 분해해 보겠습니다.
price_cake와 price_cookie는 처음에 문자열입니다. 총합을 구하려면 먼저 해당 정수 값으로 변환해야 합니다. 그렇지 않으면 컴파일러는 숫자 덧셈이 아니라 문자열 이어붙이기를 하려는 것으로 간주합니다. 그런 다음 이 값을 최종 표시 문자열에 넣어야 하므로, 메시지의 나머지 부분과 결합하기 위해 총합을 문자열로 변환해야 합니다.
이 예제가 데이터 타입 변환의 중요성을 이해하는 데 도움이 되었기를 바랍니다. 아주 작은 예시이지만 그 유용성을 이미 확인할 수 있습니다.
참고: 문자열을 정수나 실수로 변환할 때 "가능하다면"이라는 표현을 보셨나요? 문자열을 항상 숫자로 변환하고 수치 연산을 적용할 수 있는 것은 아닙니다. 컴파일러는 이를 인지하고 있으며, 시도할 경우 오류를 발생시킵니다. 아래 예제를 확인하세요:
price_cake = 'fifteen'
price_cookie = 'six'
total = int(price_cake) + int(price_cookie)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-25-80591b8accda> in <module>()
1 price_cake = 'fifteen'
2 price_cookie = 'six'
----> 3 total = int(price_cake) + int(price_cookie)
ValueError: invalid literal for int() with base 10: 'fifteen'
요약: Python 기본형 데이터 타입 변환
| 변환 | 함수 | 예시 | 출력 |
|---|---|---|---|
| 정수 → 실수 | float() |
float(3) |
3.0 |
| 실수 → 정수 | int() |
int(3.9) |
3 |
| 문자열 → 정수 | int() |
int('123') |
123 |
| 정수 → 문자열 | str() |
str(123) |
'123' |
비기본형 데이터 구조 변환
Python에서 튜플과 리스트로의 변환
정수와 실수처럼 리스트를 튜플로, 튜플을 리스트로 변환할 수도 있습니다.
튜플과 리스트가 무엇인지 기억하시나요? Python의 리스트와 튜플은 동질의 항목 모음을 저장하는 데 사용됩니다. 둘의 차이는 튜플은 변경 불가능(immutable)하다는 점입니다. 한 번 정의하면 내부의 값을 삭제, 추가, 수정할 수 없습니다.
왜 리스트를 튜플로 변환할까요?
튜플은 변경 불가능한 데이터 타입이므로 프로그램에서 상당한 최적화를 가능하게 합니다.
그렇다면 왜 튜플을 리스트로 변환할까요?
초기 튜플에 변경을 가하고 싶을 수 있습니다. 이 경우 리스트로 변환해 변경한 다음 다시 튜플로 변환할 수 있습니다.
Python에서는 tuple() 함수를 사용해 전달된 값을 튜플로 바꿀 수 있고, 유사하게 list() 함수로 튜플을 리스트로 변환할 수 있습니다:
a_tuple = ('a', 1) ,('f', 2), ('g', 3)
b_list = [1,2,3,4,5]
print(tuple(b_list))
print(list(a_tuple))
(1, 2, 3, 4, 5)
[('a', 1), ('f', 2), ('g', 3)]
마찬가지로, 문자열을 리스트나 튜플로 변환하는 방법은 다음과 같습니다:
dessert = 'Cake'
# Convert the characters in a string to individual items in a tuple
print(tuple(dessert))
# Convert a string into a list
dessert_list = list(dessert)
dessert_list.append('s')
print(dessert_list)
('C', 'a', 'k', 'e')
['C', 'a', 'k', 'e', 's']
Python에서 딕셔너리와 세트로의 변환
dict() 함수로 튜플을 딕셔너리로, set()으로 리스트를 세트로 변환할 수 있습니다.
print(dict(a_tuple))
print(set(b_list))
{'a': 1, 'f': 2, 'g': 3}
{1, 2, 3, 4, 5}
다른 변환 함수들과 유사하게, 적절한 함수 이름을 제공하기만 하면 어떤 데이터 타입이든 딕셔너리나 세트로 변환할 수 있습니다.
구조적 데이터를 위한 dataclasses 활용(Python 3.7+)
딕셔너리나 튜플 대신, dataclasses는 구조적 데이터를 다루는 더 나은 방법을 제공합니다.
from dataclasses import dataclass
@dataclass
class Product:
name: str
price: float
in_stock: bool
item = Product("Laptop", 799.99, True)
print(item) # Output: Product(name='Laptop', price=799.99, in_stock=True)
요약: Python 비기본형 데이터 구조 변환
| 변환 | 함수 | 예시 | 출력 |
|---|---|---|---|
| 리스트 → 튜플 | tuple() |
tuple([1, 2, 3]) |
(1, 2, 3) |
| 튜플 → 리스트 | list() |
list(('a', 1)) |
['a', 1] |
| 문자열 → 리스트 | list() |
list('Cake') |
['C', 'a', 'k', 'e'] |
| 문자열 → 튜플 | tuple() |
tuple('Cake') |
('C', 'a', 'k', 'e') |
| 튜플 → 딕셔너리 | dict() |
dict((('a', 1), ('b', 2))) |
{'a': 1, 'b': 2} |
| 리스트 → 세트 | set() |
set([1, 2, 3, 4, 5]) |
{1, 2, 3, 4, 5} |
Python의 유니코드, 이진수, 8진수, 16진수 정수
수 체계는 어떤 숫자 값을 나타내는 데 사용하는 기호나 문자의 개수를 말합니다. 일상에서 보통 사용하는 수 체계는 10진법입니다. 10진법에서는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9의 열 가지 기호를 사용해 모든 양을 표현합니다. 유니코드, 이진수, 16진수, 8진수는 서로 다른 수 체계를 가리킵니다.
사용 가능한 기호가 다 떨어지면 다음 자릿수로 넘어갑니다. 10진법에서는 9보다 하나 큰 수를 10으로 표기하는데, 이는 10의 자리 1개와 1의 자리 0개를 의미합니다. 하지만 다른 수 체계에서는 다릅니다. 예를 들어 0과 1 두 기호만 사용하는 이진수에서는 기호가 다 떨어지면 다음 자릿수로 넘어가야 합니다. 이진수에서는 이렇게 셉니다: 0, 1, 10, 11, 100, 101, …
다음 섹션에서 몇 가지 수 체계를 더 자세히 살펴보겠습니다.
Python에서 이진수를 10진수로 변환
이진수 정수는 밑이 2인 수입니다. 즉, 이진수 체계에서는 숫자를 나타내는 데 0과 1 두 기호만 사용합니다. 이진수로 0부터 올려 세면 기호가 더 빨리 소진됩니다: 0, 1, ???
이후에는 더 이상 사용할 기호가 없습니다. 2는 이진수에 존재하지 않으므로 2라는 숫자로 가지 않습니다. 대신 1과 0의 조합을 사용합니다. 이진수 1000은 10진수 8과 같습니다. 이진수에서는 2의 거듭제곱을 사용하므로, 8은 (1(2^3)) + (0(2^2)) + (0(2^1)) + (0(2^0)) = 8입니다. 1과 0의 위치가 2를 몇 제곱해야 하는지를 결정합니다.
더 복잡한 예제로 확인해 보겠습니다:
Binary Number = 1001111
Decimal value = (1*(2^6)) + (0*(2^5)) + (0*(2^4)) + (1*(2^3)) + (1*(2^2)) + (1*(2^1)) + (1*(2^0))
= 79
Python에서는 bin() 함수를 사용해 10진 값을 해당 이진 표현으로 변환할 수 있습니다.
마찬가지로 int() 함수를 사용해 이진수를 10진수로 변환할 수 있습니다. int() 함수의 두 번째 인수로 변환할 수의 밑을 전달하며, 이진수의 경우 2입니다.
a = 79
# Base 2(binary)
bin_a = bin(a)
print(bin_a)
print(int(bin_a, 2)) #Base 2(binary)
0b1001111
79
Python에서 8진수를 10진수로 변환
8진수는 일반적인 10진법보다 기호가 더 적은 또 다른 수 체계입니다. 밑이 8로, 모든 양을 표현하는 데 0, 1, 2, 3, 4, 5, 6, 7의 여덟 가지 기호를 사용합니다. 7 다음은 8이 존재하지 않으므로 10입니다.
이진수에서 값 계산에 2의 거듭제곱을 사용한 것처럼, 8진수에서는 밑이 8이므로 8의 거듭제곱을 사용합니다.
8진수에서 10은 10진수 8과 같습니다. 풀어 쓰면: (1(8^1)) + (0(8^0)) = 8.
좀 더 복잡한 예:
Octal Number = 117
Decimal value = (1*(8^2)) + (1*(8^1)) + (7*(8^0))
= 79
Python에서는 oct() 함수를 사용해 10진 값을 해당 8진 표현으로 변환할 수 있습니다. 또는 int() 함수와 올바른 밑(8진수의 경우 8)을 사용할 수도 있습니다.
a = 79
# Base 8(octal)
oct_a = oct(a)
print(oct_a)
print(int(oct_a, 8))
0o117
79
Python에서 16진수를 10진수로 변환
16진수는 밑이 16인 수 체계입니다. 이진수나 8진수와 달리, 10진수에 없는 여섯 개의 추가 기호를 사용합니다.
그렇다면 9 다음은 무엇일까요?
일반 숫자 기호를 넘어서는 추가 기호가 필요하면 알파벳 문자를 사용합니다. 따라서 16진수에서는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F를 사용합니다.
앞의 예와 동일하게 사용해 보겠습니다:
Hexadecimal Number = 4F
Decimal value = (4*(16^1)) + (F*(16^0))
= 79
Python에서는 hex() 함수를 사용해 10진 값을 해당 16진 표현으로 변환하거나, int() 함수에 밑 16을 사용해 16진수를 10진수로 변환할 수 있습니다.
a = 79
# Base 16(hexadecimal)
hex_a = hex(a)
print(hex_a)
print(int(hex_a, 16))
0x4f
79
유니코드를 문자로 변환
Python의 chr()는 유니코드 정수를 문자열로 변환합니다. 유니코드는 다양한 언어의 문자를 표기하기 위한 보편적으로 인정된 문자 인코딩입니다.
chr() 함수에 다양한 유니코드 정수를 전달해 “DATACAMP”를 표시했습니다. 또한 ord()로 단일 문자를 유니코드 정수로 변환할 수도 있습니다.
print(
chr(68),
chr(65),
chr(84),
chr(65),
chr(67),
chr(65),
chr(77),
chr(80),
)
D A T A C A M P
요약: Python 수 체계 변환
| 변환 | 함수 | 예시 | 출력 |
|---|---|---|---|
| 10진수 → 2진수 | bin() |
bin(79) |
0b1001111 |
| 2진수 → 10진수 | int() |
int('1001111', 2) |
79 |
| 10진수 → 8진수 | oct() |
oct(79) |
0o117 |
| 8진수 → 10진수 | int() |
int('117', 8) |
79 |
| 10진수 → 16진수 | hex() |
hex(79) |
0x4f |
| 16진수 → 10진수 | int() |
int('4F', 16) |
79 |
| 유니코드 → 문자 | chr() |
chr(68) |
'D' |
| 문자 → 유니코드 | ord() |
ord('D') |
68 |
잘하셨습니다!
축하합니다! 주로 내장 메서드를 사용해 Python의 데이터 형 변환을 학습했습니다. 이는 다양한 데이터 타입을 유연하게 다루며 프로그램을 작성하는 데 큰 도움이 됩니다.
Intermediate Python for Data Science 과정에서는 matplotlib로 데이터를 시각화하고, 딕셔너리와 유명한 pandas DataFrame을 다루는 방법을 배웁니다. 또한 반복문으로 프로그램의 흐름을 제어하는 방법도 살펴봅니다. 과정 마지막에는 학습한 내용을 종합적으로 적용해 볼 수 있는 사례 연구가 준비되어 있습니다!
FAQs
Python에서 정수 리스트를 하나의 문자열로 변환하려면 어떻게 하나요?
map()과 join() 메서드를 함께 사용해 각 정수를 문자열로 변환한 뒤 연결할 수 있습니다.
int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result) # Output: '1234'
숫자가 아닌 문자열을 정수로 변환하려고 하면 어떻게 되나요?
ValueError가 발생하며, 해당 문자열이 유효한 정수가 아니라고 표시됩니다.
int('abc') # Raises ValueError: invalid literal for int() with base 10: 'abc'
Python에서 세트를 리스트로 변환할 수 있나요? 방법은?
예, list() 함수를 사용해 세트를 리스트로 변환할 수 있습니다.
a_set = {1, 2, 3}
a_list = list(a_set)
print(a_list) # Output: [1, 2, 3]
공백으로 구분된 숫자 문자열을 정수 리스트로 변환하려면 어떻게 하나요?
split() 메서드로 문자열을 분리한 뒤 map()으로 각 부분을 정수로 변환하세요.
numbers = "1 2 3 4"
int_list = list(map(int, numbers.split()))
print(int_list) # Output: [1, 2, 3, 4]
Python에서 변수의 데이터 타입을 확인하는 함수는 무엇인가요?
type() 함수를 사용해 변수의 데이터 타입을 확인할 수 있습니다.
x = 5
print(type(x)) # Output: <class 'int'>