본문 바로가기
Python/Python 기초

[개발로그 Python] 데이터 타입 - No.5

by 마이자몽 🌻♚ 2021. 6. 3.

Python 3.9.5를 사용했습니다.

데이터 타입이란?

아래는 Java의 코드 입니다.

// 원시 타입
int number1 = 1;
double number2 = 10.1;
boolean is = true;

// 참조 타입
String word = new String();

위의 예시와 같이 변수 앞에 붙어 있는 int, double, boolean, String 이 데이터의 타입입니다. 데이터 타입은 컴퓨터가 데이터를 어떻게 다뤄야할지 알려주기 위해 사용되는 표현입니다. 즉 변수의 타입이라고 할 수 있습니다. 데이터 타입은 원시 타입과 참조 타입으로 구분이 됩니다.

 

원시 타입

int, long, foat, boolean 등 메모리에 값이 저장

Java 숫자 타입 표현 범위

위 이미지는 Java의 숫자 타입의 메모리 크기와 표현 가능한 범위를 나타낸 표입니다. 메모리에 직접 값을 저장해서 크기에 따라 0과 1로 표현할 수 있는 범위가 있습니다. 이렇게 메모리에 직접 값이 저장되는 타입들을 원시 타입이라고 합니다.

 

참조 타입

String, Class 이름 등 메모리에 객체의 주소가 저장되는 참조

참조 타입은 값이 아닌 객체의 주소를 갖고 있습니다.

 

 

프로그래밍 언어에서는 원시타입과 참조타입으로 데이터 타입이 나뉘는데... 두가지의 차이점은 메모리에 저장되는 것이 값인지 객체의 주소인지에 따라 구분 됩니다.

 

Python의 경우 모든 것이 객체로 되어 있기 때문에 원시타입을 지원하지 않습니다.

Python은 메모리를 더 차지하고 속도가 느리더라도 훨씬 다양하고 편리한 기능 제공을 중점으로 둔 언어이기 때문에 원시타입을 포기하고 객체를 참조하는 방법을 선택했습니다.

 

데이터타입을 왜 사용할까요?

 Python의 문법을 보면... 변수 앞에 데이터 타입을 붙여주지 않습니다. 하지만... 다른 언어에서 제공해주는 원시타입들은 모두 객체로 되어 있어 모두 타입이 있는 것 입니다.

 

 어차피 문법에서도 타입을 지정해주지 않는데... 뭐하러 데이터 타입을 사용할까요?

 

 

 병원에 진료를 받는다고 가정해 보겠습니다. 접수처에서 우리는 "감기기운이 있어서 왔어요", "발이 부러진것 같아요", "눈이 빨개요" 등 어디가 어떻게 아픈지 설명하고 접수할 과를 지정해주죠. 만약 이런 설명없이 그냥 "아파요"라고하면...온갖 검사를 다 해보고 "뼈에 문제가 있으신 것 같으니 정형외과로 가보세요."라는 답변을 받을 수 있겠죠. 과정이 매우 오래 걸리겠죠? 데이터 타입을 사용하는 이유도 마찬가지 입니다. 타입을 미리 지정해줘서 컴퓨터가 어떤 작업을 해야하는지 미리 알려주는 거죠. 원시 타입의 경우에는... 메모리의 크기도 정해져 있고 참조가 아닌 값이 들어있어 직관적으로 빠르게 읽을 수 있습니다.

 

 

Python의 데이터 타입

Python의 데이터 타입은 모두 참조 타입이라고 했습니다. 그래서 다른 언어에서 사용되고 있는 원시 타입도 모두 객체로 되어 있어 참조타입인거죠. 

 

Python의 데이터 타입

w = 100
print(type(w)) # <class 'int'>

x = 100.00
print(type(x)) # <class 'str'>

y = complex('1+2j')
print(type(y)) # <class 'complex'>

z = True
print(type(z)) # <class 'bool'>

다른 언어에서 원시타입으로 취급하는 타입이 Python에서는 문자, 정수, 실수 그리고 논리 타입에 대한 객체로 표현되고 있습니다.

 

Python에서는 다른 언어에서 지원하는 원시타입도 객체로 되어 있어 얻을 수 있는 장점과 단점들이 있습니다.

 

장점

기능과 편리성을 중심으로하기 때문에.... 타입에 대해서 많이 자유롭습니다. Java의 경우 범위에 따라 정수형을 표현하기 위해 byte, short, int, long 으로 표현합니다. long의 범위로 표현하지 못하는 숫자는 BigInteger라는 클래스를 사용해서 결국 참조 타입으로 사용하게 되죠. Python은 int 타입이 참조 타입이기 때문에 무제한으로 표현할 수 있어 범위를 넘어가거나 타입에 대한 걱정을 할 필요가 없습니다.

 

x = 100
print(id(x), type(x)) # 2678038156752 <class 'int'>
x = 'asd'
print(id(x), type(x)) # 2678039955056 <class 'str'>

다른 타입의 데이터를 같은 변수에 할당해 주는 것도 가능합니다. 위의 예시에서는 바라보고 있는 메모리 주소의 값을 출력해주는 id 함수와 변수의 데이터 타입을 출력해주는 type 함수를 사용했습니다. x는 100이라는 객체의 주소를 보다가 'asd'라는 새로운 객체를 생성해서 해당 객체와 연결해 줍니다. 즉, 새로운 주소를 바라보고 기존 객체에서 값을 변경해주지 못하는 변할 수 없는(Immutable) 변수 입니다. Python의 문자, 정수, 실수는 모두 Immutable한 데이터 타입입니다. 이후 데이터 구조에 대한 글에서 값이 변할 수 있는(mutable) 데이터 타입에 대해서 알아볼겁니다. 

 

 

단점

편리한 만큼... 원시타입 범위에 들어가는 데이터에 대해서는 처리하는데 다른 언어보다 느린 단점이 있고... 편리함을 추구하는 언어인데 오히려 개발자들이 불편해 하는 경우도 있습니다.

 

x = 100
print(type(x)) # <class 'int'>
y = 'asd'
print(type(y)) # <class 'str'>

print(x + y) # TypeError: unsupported operand type(s) for +: 'int' and 'str'

타입을 지정해주지 않아서 인터프리터에서 실행하기 전까지는 타입에 대한 오류를 확인할 수 없다는 단점이 있어 많은 개발자들 오히려 불편해하는 경우도 많습니다. 위 예시는 짧아서 문제가 없겠지만... 긴 코드에서 'int' 타입과 문자열인  'str' 타입을 더하는데 실행전까지는 오류라는 것을 알 수 없습니다. 이런 아이러니한 문제도 있습니다.

 

 

데이터 타입의 연산

# 숫자 타입 연산
x, y = 100, 6
print(x + y) # 덧셈 : 106
print(x - y) # 뺄셈 : 94
print(x * y) # 곱셈 : 600
print(x / y) # 나눗셈 : 16.666666666666668
print(x // y)# 몫 : 16
print(x % y) # 나머지 : 4
print(x ** y) # 제곱 : 1000000000000


# 논리 타입 연산
x = y = 10

# 값에 대한 비교
print(x > y)  # False
print(x >= y) # True
print(x < y)  # False
print(x <= y) # True
print(x == y) # True

# 값이 아닌 같은 객체인지 비교
print(x is y) # True


# 문자 타입 연산
x = '='
print(x * 20) # ====================

설명보다는 실행 결과를 확인하면서 사용법을 익히는 것으로 대체합니다.

 

 

데이터 타입 변환

# 숫자를 문자열과 합치고 싶은 경우
text = '남은 수량 : '
count = 50
print(text + count) # TypeError: can only concatenate str (not "int") to str

# 문자를 순자로 변형해서 연산하고 싶은 경우
text = '300'
count = 50
print(text + count) # TypeError: can only concatenate str (not "int") to str

프로그래밍을 하다가 숫자 타입을 문자열과 합쳐서 출력하고 싶거나... 문자 타입으로된 숫자를 다른 숫자와 연산하고 싶을 때 어떻게 해야할까요? 다른 언어에서와 마찬가지로 Python에서도 데이터 타입에 대한 변환을 해줄 수 있는 함수가 있어요. 문자 타입으로 변환해주는 "str" 함수와 숫자 타입으로 변환해주는 "int" 함수를 사용하면 됩니다.

 

# 숫자를 문자열과 합치고 싶은 경우
text = '남은 수량 : '
count = 50
print(text + str(count)) # 남은 수량 : 50

# 문자 타입의 format 함수를 이용한 방법 
print('{0}{1}'.format(text, count)) # 남은 수량 : 50


# 문자를 순자로 변형해서 연산하고 싶은 경우
text = '300'
count = 50
print(int(text) + count) # 350

str과 int 함수를 이용해서 타입 변환이 가능합니다. 문자 타입으로 변환하기 위해 format이라는 함수도 사용할 수 있습니다. 위에 타입 출력하는 예시에서 complex라는 함수를 사용했었는데요.... complex함수도 데이터 변환해주는 함수입니다.

 

 

정리

  • 데이터 타입은 컴퓨터가 데이터를 어떻게 다뤄야할지 알려주기 위해 사용되는 표현
  • 데이터 타입은 원시 타입과 참조 타입으로 구분
  • Python의 경우 모든 것이 객체로 되어 있기 때문에 원시타입을 지원하지 않는다
  • Python은 타입에 대해서 자유롭다
  • 편리한 만큼... 원시타입 범위에 들어가는 데이터에 대해서는 처리하는데 다른 언어보다 느린 단점이 있다
  • 데이터 타입끼리 연산이 가능하다
  • Python에는 데이터 변환을 위한들이 내장되어 있다

 

댓글0