λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
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μ—λŠ” 데이터 λ³€ν™˜μ„ μœ„ν•œλ“€μ΄ λ‚΄μž₯λ˜μ–΄ μžˆλ‹€

 

λŒ“κΈ€