์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
TIOBE ์„ ์ • ์˜ฌํ•ด์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
2006๋…„
Ruby
โ†’
2007๋…„
Python
โ†’
2008๋…„
C
2009๋…„
Go
โ†’
2010๋…„
Python
โ†’
2011๋…„
Objective-C
2017๋…„
C
โ†’
2018๋…„
Python
โ†’
2019๋…„
C
2019๋…„
C
โ†’
2020๋…„
Python
โ†’
์—†์Œ
ํŒŒ์ด์ฌ
Python
๊ฐœ๋ฐœ
ํŒŒ์ด์ฌ ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋‹จ (PSF)
๋ฒ„์ „
3.9.2
2021๋…„ 2์›” 19์ผ ์—…๋ฐ์ดํŠธ
์›น์‚ฌ์ดํŠธ


1. ๊ฐœ์š”2. ํŠน์ง•
2.1. ๋””์ž์ธ ์ฒ ํ•™2.2. ์ˆœ์ˆ˜ ๊ฐ์ฒด์ง€ํ–ฅ2.3. ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด
3. ์žฅ์ 
3.1. ๋†’์€ ์ƒ์‚ฐ์„ฑ3.2. ๋ฌธ๋ฒ• ํ†ต์ผ์— ๋”ฐ๋ฅธ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ3.3. ๊ณผํ•™/๊ณตํ•™ ์นœํ™”3.4. ๋งŒ๋Šฅ ์–ธ์–ด3.5. ๊ต์œก
4. ๋ฌธ์ œ์ 
4.1. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ถˆ๊ฐ€ ๋ฌธ์ œ
4.1.1. ๋ฉ€ํ‹ฐ์ฝ”์–ด๋กœ ํ”„๋กœ๊ทธ๋žจ ๋Œ๋ฆฌ๊ธฐ
4.2. ๋‚œ์žกํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฐ ํ•˜์œ„ ํ˜ธํ™˜ ์—๋Ÿฌ
4.2.1. ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ4.2.2. ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ
5. ๋‹ค์–‘ํ•œ python ๊ตฌํ˜„์ฒด ์ข…๋ฅ˜
5.1. Stackless Python5.2. C ์–ธ์–ด ํ™•์žฅ, Cython5.3. C++ ๊ตฌํ˜„, Pyston (ํ”„๋กœ์ ํŠธ ์ค‘๋‹จ)5.4. Python ๊ตฌํ˜„, PyPy5.5. Java ๊ตฌํ˜„, Jython5.6. .NET Framework ๊ตฌํ˜„, IronPython5.7. JavaScript ๊ตฌํ˜„, Brython
5.7.1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ transcrypt
5.8. Micro Python
6. ์ƒํƒœ๊ณ„
6.1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
6.1.1. ํ…์ŠคํŠธ ์—๋””ํ„ฐ6.1.2. ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(IDE)6.1.3. Notebook6.1.4. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ6.1.5. ์ฝ”๋“œ ๊ฒ€์‚ฌ
6.2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
6.2.1. ์ˆ˜ํ•™6.2.2. ๋ฐ์ดํ„ฐ6.2.3. ๊ทธ๋ž˜ํ”„ (์ฐจํŠธ) ๊ทธ๋ฆฌ๊ธฐ6.2.4. ๋จธ์‹  ๋Ÿฌ๋‹6.2.5. GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ
6.2.5.1. tkinter6.2.5.2. Qt for Python
6.3. ํ”„๋ ˆ์ž„์›Œํฌ
6.3.1. ์›น ํ”„๋ ˆ์ž„์›Œํฌ6.3.2. ๊ทธ ์™ธ
7. ๊ด€๋ จ ํŒ8. ๋ฌธ๋ฒ•9. ๋„์„œ10. ์—ฌ๋‹ด

1. ๊ฐœ์š”[ํŽธ์ง‘]

# 1
print("Hello, world!")
# 2
import __hello__
# ๋‘˜์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉ

์œ„์˜ ๋ฌธ๋ฒ•์€ ํŒŒ์ด์ฌ 3 ๊ธฐ์ค€์ด๋‹ค. ํŒŒ์ด์ฌ 2์—์„œ๋Š” print "Hello, world!"๋งŒ ํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.
"Life is short (You need Python)"[1]
์ธ์ƒ์€ ์งง์œผ๋‹ˆ, ๋‹น์‹ ์€ ํŒŒ์ด์ฌ์ด ํ•„์š”ํ•˜๋‹ค.

- Bruce Eckel
1991๋…„์— ๋ฐœํ‘œ๋œ, MATLAB๊ณผ ์œ ์‚ฌํ•œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ๊ณต์‹ ๊นƒํ—™ ์ €์žฅ์†Œ

์ตœ์‹  ๋ฒ„์ „์€ 2020๋…„ 12์›” 07์ผ์— ๋‚˜์˜จ 3.9.1 ๋ฒ„์ „์ด๋ฉฐ 0.1๋ฒ„์ „๋งˆ๋‹ค for๋ฌธ ๋“ฑ์˜ ๋ฃจํ”„์—์„œ ์—ฐ์‚ฐ ํšจ์œจ์ด ์•ฝ 2๋ฐฐ ๋นจ๋ผ์ง€๋Š” ๊ฐœ์„ ์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ์ตœ์‹  ๋ฒ„์ „์ด 3๊ฐœ์›” ์ด์ƒ ์ง€๋‚˜ ์•ˆ์ •ํ™”๊ฐ€ ๋œ ํ›„์—๋Š” ๊ท€์ฐฎ๋”๋ผ๋„ ๋ฒ„์ „์„ ๋ฐ˜๋“œ์‹œ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

์˜จ๋ผ์ธ ์ƒ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ๋กœ.[2]

์ฐฝ์‹œ์ž๋Š” ๊ท€๋„ ๋ฐ˜ ๋กœ์„ฌ(Guido van Rossum). 1989๋…„ ํฌ๋ฆฌ์Šค๋งˆ์Šค ์ฃผ์—, ์—ฐ๊ตฌ์‹ค์ด ๋‹ซํ˜€์žˆ์–ด์„œ ์‹ฌ์‹ฌํ•œ ๊น€์— ๋งŒ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ๋†๋‹ด์ด ์•„๋‹ˆ๊ณ  ๋ฐ˜ ๋กœ์„ฌ์„ ์œ ๋Ÿฝ์—์„œ๋Š” ์• ๋ค ์Šค๋ฏธ์Šค์— ๋น„๊ตํ•  ์ •๋„๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณ„์˜ ๊ฒฝ์ œํ•™์ž๋ผ๋‚˜... ์‹ฌ์‹ฌํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ํŒŒ์ด์ฌ ์„œ๋ฌธ๊ณผ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์›จ์–ด์™€ ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์‚ฌ์‹ค์ด๋‹ค. ๊ธฐ์ˆ ์ž๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์‹ฌ์‹ฌํ•  ๋•Œ, ํ˜น์€ ์‹ค์ˆ˜๋กœ ๊ฑธ์ž‘์„ ๋งŒ๋“ ๋‹ค. 2000๋…„์—๋Š” Python 2, 2008๋…„์—๋Š” Python 3๊ฐ€ ๋‚˜์™”๋‹ค.

์ด๋ฆ„์€ ๊ท€๋„๊ฐ€ ์ฆ๊ฒจ ๋ณด๋˜ ์˜๊ตญ์˜ 6์ธ์กฐ ์ฝ”๋ฏธ๋”” ๊ทธ๋ฃน ๋ชฌํ‹ฐ ํŒŒ์ด์„ ์—์„œ ๋”ฐ์™”๋‹ค๊ณ  ํ•œ๋‹ค. ์ง€๊ธˆ CPython์˜ ๊ณต์‹ GitHub ์ €์žฅ์†Œ๋ฅผ ๋ณด๋ฉด ํ˜‘์—…๋ณด์กฐ์šฉ ๋ด‡ ์ด๋ฆ„๋“ค์ด the-knights-who-say-ni(๋‹ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ธฐ์‚ฌ)๋‚˜ bedevere(๋ฒ ๋””๋น„์–ด) ๊ฐ™์ด ์ฃ„๋‹ค ๋ชฌํ‹ฐ ํŒŒ์ด์„ ๊ณผ ์„ฑ๋ฐฐ์˜ ๋ฐฐ์—ญ๋“ค์ด๋‹ค. ๋งŽ์€ ํŒŒ์ด์ฌ ๊ต์žฌ๋“ค์—์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ spam, eggs๋กœ ์ง“๋Š” ๋“ฑ ๋“œ๋ฆฝ์„ ์นœ๋‹ค. ์ง์ ‘์  ๊ด€๊ณ„๋Š” ์—†์ง€๋งŒ 42๋„ ํ•„์ˆ˜์š”์†Œ. ๋˜ํ•œ ์‹œ์ž‘ ํ”„๋กœ๊ทธ๋žจ ์ค‘ ํ•˜๋‚˜์˜ ์ด๋ฆ„์ด ์•„์ด๋“ค(Idle)์ธ๋ฐ, ํƒ„์ƒ๋ฐฐ๊ฒฝ์„ ์ƒ๊ฐํ•ด ๋ณธ๋‹ค๋ฉด ๋ชฌํ‹ฐ ํŒŒ์ด์„ ์˜ ๋ฉค๋ฒ„ ์—๋ฆญ ์•„์ด๋“ค(Eric Idle)์˜ ์ด๋ฆ„์—์„œ ์œ ๋ž˜ํ•˜์˜€์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋ฌผ๋ก  ์‚ฌ์ „์  ์˜๋ฏธ๋ฅผ ์ƒ๊ฐ ์•ˆ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋ผ์„œ ์‹ฌ๋ณผ๋งˆํฌ๊ฐ€ ๋ฑ€ ๋ชจ์–‘์ด๋‹ค.

๋ฌธ๋ฒ•์ด ๋งค์šฐ ์‰ฌ์›Œ์„œ ์ดˆ๋ณด์ž๋“ค์ด ์ฒ˜์Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šธ ๋•Œ ์ถ”์ฒœ๋˜๋Š” ์–ธ์–ด์ด๋‹ค. ์˜ค์ฃฝํ•˜๋ฉด Python์˜ ๋ณ„๋ช…์ด '์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์‚ฌ ์ฝ”๋“œ(Executable pseudocode)'์ผ ์ •๋„. ์‹ค์ œ๋กœ๋„ ๋ฏธ๊ตญ ๊ณต๊ณผ ๋Œ€ํ•™๊ต์—์„œ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ ์ˆ˜์—…์œผ๋กœ Python์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ํ•™์Šต์šฉ์œผ๋กœ ์ข‹์€ ์–ธ์–ด์ธ ๋™์‹œ์— ์‹ค์‚ฌ์šฉ๋ฅ ๊ณผ ์ƒ์‚ฐ์„ฑ๋„ ๋†’์€ ๊ฐ•๋ ฅํ•œ ์–ธ์–ด์ธ ์…ˆ. ์ฆ‰ ์ ‘๊ทผ์„ฑ๊ณผ ์‘์šฉ๋ ฅ์ด ์ข‹๋‹ค๋Š” ๊ฒŒ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค. ๋ฐฐ์šฐ๊ธฐ๋„ ์‰ฝ๊ณ  ์จ๋จน๊ธฐ๋„ ์‰ฝ๊ณ  Python์˜ ์ด๋Ÿฐ ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋Š” ๊ต์œก์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ BASIC์ด ๋งํ–ˆ์–ด์š” ๋ฃจํŠธ๋ฅผ ํƒ€๊ฒŒ ๋œ ๊ฒฐ์ •์ ์ธ ์ด์œ ์ด๋‹ค. Python์€ BASIC๊ณผ ๋‹ฌ๋ฆฌ ํ•™๊ต์—์„œ ๋ฐฐ์šฐ๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ํ˜„์—…์—์„œ๋„ ์ž์ฃผ ์“ฐ์ด๋Š” ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋†๋‹ด์ด ์•„๋‹ˆ๊ณ  ํŒŒ์ด์ฌ์ด ๊ต์œก์šฉ ์–ธ์–ด๋กœ ์ž๋ฆฌ์žก์œผ๋ฉด์„œ ๋ฒ ์ด์ง์€ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์— ์˜ํ•ด ์‚ฐ์†Œํ˜ธํก๊ธฐ๋ฅผ ๋‹ฌ๊ณ  ์—ฐ๋ช…๋งŒ ํ•˜๋Š” ์‹ ์„ธ๊ฐ€ ๋๋‹ค. MS๊ฐ€ ์—†์œผ๋ฉด BASIC์€...

2010๋…„ ํ›„๋ฐ˜๋Œ€์— ์ด๋ฅด๋Ÿฌ์„œ๋Š” ํ’๋ถ€ํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›์œผ๋กœ ๋จธ์‹ ๋Ÿฌ๋‹, ๋”ฅ๋Ÿฌ๋‹๋“ฑ ์ธ๊ณต์ง€๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์–ธ์–ด๋กœ์„œ ๊ฐ๊ด‘์„ ๋ฐ›๊ณ  ์žˆ๋‹ค. ์‚ฌ์ดํ‚ท-๋Ÿฐ(Scikit-learn), ํ…์„œํ”Œ๋กœ์šฐ(TensorFlow), CNTK, ์•„ํŒŒ์น˜ ์ŠคํŒŒํฌ MLlib(Apache Spark MLlib), ํŒŒ์ดํ† ์น˜(PyTorch)๋“ฑ ์„ฑ๋Šฅ๋„ ๋›ฐ์–ด๋‚˜๋ฉฐ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹, ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›๋“ค์ด ํŒŒ์ด์ฌ์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํŒŒ์ด์„ ์€ ๋งŽ์€ ๋ธ”๋ก์ฝ”๋”ฉ์— ์‚ฌ์šฉ๋œ๋‹ค.

์›๋ฌธ๋ณด๊ธฐ: #

2. ํŠน์ง•[ํŽธ์ง‘]

2.1. ๋””์ž์ธ ์ฒ ํ•™[ํŽธ์ง‘]

Perl์˜ 'ํ•˜๋‚˜ ์ด์ƒ์˜ ํ•ด๊ฒฐ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค' ์— ๋Œ€๋น„๋˜๋Š” '๊ฐ€์žฅ ์•„๋ฆ„๋‹ค์šด ํ•˜๋‚˜์˜ ๋‹ต์ด ์กด์žฌํ•œ๋‹ค' ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚จ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ์ฝ๊ณ  ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•„์ฃผ ์ ˆ์‹คํžˆ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ ์€ Tim Peters๊ฐ€ ์ž‘์„ฑํ•œ ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ์ฒ ํ•™(The Zen of Python)์—์„œ ๋” ์ž์„ธํžˆ ๋‚˜์—ด๋˜์–ด ์žˆ๋Š”๋ฐ, 20๊ฐ€์ง€ ํ•ญ๋ชฉ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‹ค์€ 19๊ฐ€์ง€ ํ•ญ๋ชฉ๋งŒ ์žˆ๋Š” ๋“ฑ '๊ทœ์น™'๋ณด๋‹ค๋Š” ๋†๋‹ด๋„ ์„ž์ธ '์กฐ์–ธ'์— ๊ฐ€๊นŒ์šด ๋ฌธํ•ญ๋“ค์ด๋‹ค. # ์ฝ˜์†”์—์„œ "import this"๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ด์Šคํ„ฐ ์—๊ทธ๋กœ์จ ํŒŒ์ด์ฌ์„ ํ†ตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. dir(this)๋ฅผ ํ•˜๋ฉด ROT13์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ this.s๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. this.d๋กœ dictionary( {} )๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋…ํ•˜๋ฉด ์›๋ฌธ์ด ๋‚˜์˜จ๋‹ค.

ใ€PEP 20 -- The Zen of Python ํŽผ์น˜๊ธฐ ยท ์ ‘๊ธฐใ€‘
  • ์•„๋ฆ„๋‹ค์šด ๊ฒƒ์ด ์ถ”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. (Beautiful is better than ugly.)
  • ๋ช…์‹œ์ ์ธ ๊ฒƒ์ด ์•”์‹œ์ ์ธ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. (Explicit is better than implicit.)
  • ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์ด ๋ณตํ•ฉ์ ์ธ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. (Simple is better than complex.)
  • ๋ณตํ•ฉ์ ์ธ ๊ฒƒ์ด ๋ณต์žกํ•œ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. (Complex is better than complicated.)
  • ์ˆ˜ํ‰์ ์ธ ๊ฒƒ์ด ๋‚ดํฌ๋œ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. (Flat is better than nested.)
  • ์—ฌ์œ ๋กœ์šด ๊ฒƒ์ด ๋ฐ€์ง‘ํ•œ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. (Sparse is better than dense.)
  • ๊ฐ€๋…์„ฑ์€ ์ค‘์š”ํ•˜๋‹ค. (Readability counts.)
  • ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋“ค์€ ๊ทœ์น™์„ ์–ด๊ธธ์ •๋„๋กœ ํŠน๋ณ„ํ•˜์ง€ ์•Š๋‹ค. (Special cases aren't special enough to break the rules.)
  • ํ—ˆ๋‚˜ ์‹ค์šฉ์„ฑ์€ ์ˆœ์ˆ˜์„ฑ์„ ์ด๊ธด๋‹ค. (Although practicality beats purity.)
  • ์˜ค๋ฅ˜๋Š” ์ ˆ๋Œ€๋กœ ์กฐ์šฉํžˆ ์ง€๋‚˜๊ฐ€์ง€ ์•Š๋Š”๋‹ค. (Errors should never pass silently.)
  • ๋ช…์‹œ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ถ”๋ ค๋Š” ์˜๋„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด. (Unless explicitly silenced.)
  • ๋ชจํ˜ธํ•จ์„ ๋Œ€ํ• ๋•Œ, ์ด๋ฅผ ์ถ”์ธกํ•˜๋ ค๋Š” ์œ ํ˜น์„ ๊ฑฐ๋ถ€ํ•˜๋ผ. (In the face of ambiguity, refuse the temptation to guess.)
  • ๋ช…ํ™•ํ•œ-- ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ธ‰์ ์ด๋ฉด ์œ ์ผํ•œ -- ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์€ ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค. (There should be one-- and preferably only one --obvious way to do it.)
  • ๋น„๋ก ๊ทธ ๋ฐฉ๋ฒ•์ด ์ฒ˜์Œ์—๋Š” ๋ช…ํ™•ํ•ด ๋ณด์ด์ง€ ์•Š์„์ง€๋ผ๋„[3]. (Although that way may not be obvious at first unless you're Dutch.)
  • ์ง€๊ธˆ ํ–‰๋™์— ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ์•„์˜ˆ ์•ˆํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋‚ซ๋‹ค. (Now is better than never.)
  • ๋น„๋ก ์•„์˜ˆ ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์ง€๊ธˆ *๋‹น์žฅ* ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์„๋•Œ๋„ ๋งŽ์ง€๋งŒ. (Although never is often better than *right* now.)
  • ๊ตฌํ˜„ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ๋‚˜์œ ์•„์ด๋””์–ด์ด๋‹ค. (If the implementation is hard to explain, it's a bad idea.)
  • ๊ตฌํ˜„ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฝ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์ข‹์€ ์•„์ด๋””์–ด์ผ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. (If the implementation is easy to explain, it may be a good idea.)
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค! (Namespaces are one honking great idea -- let's do more of those!)

ํŒŒ์ด์ฌ์˜ ์ด๋Ÿฐ ์ฒ ํ•™์€ ์ดํ›„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์—๋„ ์ˆ˜์ถœ๋˜์–ด, 2010๋…„๋Œ€ ๋“ค์–ด์„œ๋Š” ๊ธฐ์กด ์–ธ์–ด๋“ค๋„ ํŒŒ์ด์ฌ์ฒ˜๋Ÿผ ์ตœ๋Œ€ํ•œ ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”์‹œํ‚ค๊ณ  ํ†ต์ผํ•˜๋ ค๋Š” ๋ฌธ๋ฒ• ๋Œ€ํ†ต์ผ ์šด๋™์ด ์ผ์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ๋ ค๋ณด๊ธฐ ์ข‹๊ฒŒ ํ•œ๋‹ค๋Š” ๋งค์šฐ ์ข‹์€ ์˜ํ–ฅ์ด ์žˆ์œผ๋‹ˆ๊นŒ...

๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์˜ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์€ ๊ฐ์ž์˜ ์ทจํ–ฅ์— ๋งž๊ฒŒ ๋ฐœ์‚ฐ ์ง„ํ™”ํ•˜๋Š” ๋ฐ˜๋ฉด, ํŒŒ์ด์ฌ์€ ์œ„์˜ ์ฒ ํ•™๋“ค์„ ๋งŒ์กฑ ์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ์Šคํƒ€์ผ๋กœ ์ˆ˜๋ ด ์ง„ํ™”ํ•˜๋Š” ์„ฑํ–ฅ์ด ์žˆ๋‹ค. ์‹ค์ œ๋กœ C ๊ณ„์—ด์˜ ์–ธ์–ด์—์„œ ์ค‘๊ด„ํ˜ธ์˜ ์œ„์น˜์— ๋Œ€ํ•œ ๋…ผ์Ÿ์€ ๊ฑฐ์˜ ์ข…๊ต์  ๋…ผ์Ÿ์— ๊ฐ€๊น๋‹ค. ํ˜„์žฌ ํ•œ๊ตญ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹์€ C์–ธ์–ด์˜ ์ฐฝ์‹œ์ž Kernighan๊ณผ Ritchie์˜ K&R ์Šคํƒ€์ผ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Eric Allman์˜ ๋ฐฉ์‹์„ ๊ณ ์ˆ˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์ œ๋ฒ• ๋งŽ๋‹ค. ์ด์™ธ์—๋„ ์ค‘๊ด„ํ˜ธ ์œ„์น˜๋ฅผ ์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์œผ๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ http://gyumee.egloos.com/1306012์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”์น˜๋Š” ์•Š์ง€๋งŒ ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋ƒฅ ๋“ค์—ฌ์“ฐ๊ธฐ๊ณ  ๋ญ๊ณ  ๋‹ค ๋ฌด์‹œํ•˜๊ณ  ์ญ‰ ์ž‘์„ฑํ•ด๋†“๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฐ ์„ฑํ–ฅ์€ ๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ์—†๋Š” ํŒŒ์ด์ฌ์Šค๋Ÿฌ์›€(pythonic)์ด๋ผ๋Š” ๋…ํŠนํ•œ ๊ฐœ๋…์„ ๋‚ณ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ , ์ฝ”๋“œ์˜ ์ถ•์•ฝ๋ณด๋‹ค ๋šœ๋ ทํ•˜๊ฒŒ ๋ณด์ด๋Š” ํ๋ฆ„์„ ์ค‘์‹œํ•˜๋Š” ํŒŒ์ด์ฌ์˜ ์ฒ ํ•™์„ ์ง€์นญํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

์ด๋Ÿฐ ์ฒ ํ•™ ๋•Œ๋ฌธ์— ๋ฌธ๋ฒ•์ด ๊ต‰์žฅํžˆ ์—„๊ฒฉํ•œ ํŽธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ํ•ด๋„ ๋˜๊ณ  ์•ˆ ํ•ด๋„ ๋˜๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ด ์–ธ์–ด์—์„œ๋Š” ์˜๋ฌด๋กœ, ๋“ค์—ฌ์“ฐ๊ธฐ ์ž์ฒด๋กœ ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ์ด ๋œ๋‹ค. ์ฝ”๋“œ ๋ธ”๋Ÿญ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š์•„๋„ ๋ผ์„œ ๋น„์ฃผ์–ผ ์ ์œผ๋กœ๋Š” ๊ต‰์žฅํžˆ ๊น”๋”ํ•œ ๋ฐ˜๋ฉด ์ž์œ ๋„๋ฅผ ์ œ์•ฝํ•œ๋‹ค๋Š” ํ‰๋„ ์žˆ๋‹ค. ๊ทผ๋ฐ ์–ด์ฐจํ”ผ ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฝ”๋“œ์—์„œ ์ค‘๊ด„ํ˜ธ๋Š” ๋ชจ์•„๋†“๊ณ  ๋ณด๋ฉด ๊ต‰์žฅํžˆ ์ง€์ €๋ถ„ํ•  ๋ฟ๋”๋Ÿฌ, ๋‹น์žฅ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ด„ํ˜ธ๊ฐ€ 2๊ฐœ๋‚˜ ๋˜๊ณ ,[4] ๊ด„ํ˜ธ ํ•˜๋‚˜๋ผ๋„ ์ž˜๋ชป ๋„ฃ์œผ๋ฉด ๋ธ”๋Ÿญ์ด ๋‹ค ๊ผฌ์—ฌ๋ฒ„๋ฆฌ๋Š” ๊ท€์ฐฎ์€ ์กด์žฌ์ด์ง€๋งŒ(begin๊ณผ end ํ˜น์€ end.์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋Š” ํŒŒ์Šค์นผ์—์„œ ๋ณด๋ฉด ์ค‘๊ด„ํ˜ธ๋งŒ ํ•ด๋„ ์—„์ฒญ๋‚˜๊ฒŒ ๊ฐ„๊ฒฐํ•ด ๋ณด์ด์ง€๋งŒ), ๋Œ€์‹  ๋ธ”๋Ÿญ๋“ค์„ ์ด๋ฆฌ์ €๋ฆฌ ๋งŒ์งˆ๋•Œ๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•œ ์กด์žฌ์ด๋‹ค. ํŠนํžˆ C ์ฝ”๋“œ๋ฅผ ์ข…์ด์— ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ค‘๊ด„ํ˜ธ ์žˆ๊ณ  ์—†๊ณ ์˜ ๊ฐ€๋…์„ฑ ์ฐจ์ด๊ฐ€ ์˜์™ธ๋กœ ํฌ๋‹ค. ํŒŒ์ด์ฌ์—์„œ๋Š” ์ด ์ค‘๊ด„ํ˜ธ๋ฅผ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๋Œ€์ฒดํ•˜๋Š”๋ฐ, ์ด๊ฒŒ ๋ธ”๋Ÿญ์˜ ์‹œ์ž‘๊ณผ ๋ ์ง€์ ์„ ์ฐพ๋Š” ๋ถ€๋ถ„์—์„œ ๊ฝค ๋ถˆํŽธํ•˜๋‹ค. ๋Œ€์‹  ๊ด„ํ˜ธ๋ฅผ 2๊ฐœ๋‚˜ ์ผ์ผ์ด ๋‹ค ๋„ฃ๊ณ , ์ž˜๋ชป ๋„ฃ์ง€ ์•Š๊ฒŒ ์ ๊ฒ€๋„ ํ•ด ์ค˜์•ผํ•˜๋Š” ์ˆ˜๊ณ ๊ฐ€ ์—†๋‹ค๋Š” ์—„์ฒญ๋‚œ ์žฅ์ ์ด ์žˆ๋‹ค.
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
์ด ๋“ค์—ฌ์“ฐ๊ธฐ ์˜๋ฌด ๊ทœ์น™ ๋•Œ๋ฌธ์— ์†Œ์Šค ์ฝ”๋“œ ๋“ค์—ฌ์“ฐ๊ธฐ์— ํƒญ(Tab) ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๋งค์šฐ ๊ฐ•๋ ฅํžˆ ์š”๊ตฌํ•œ๋‹ค.[5](๋“ค์—ฌ์“ฐ๊ธฐ์— ์ตœ์ ํ™”๋œ python์„ ์“ฐ๊ธฐ์‹ซ์œผ๋ฉด ์„ธ๋ฏธ์ฝœ๋ก ๊ณผ ์ค‘๊ด„ํ˜ธ, int/char ๋“ฑ์„ ์ˆ˜์‹œ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.) ํƒญ ๋ฌธ์ž๋Š” ์‚ฌ์šฉ์ž๋‚˜ ์‹œ์Šคํ…œ์˜ ์„ค์ •์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ํญ์˜ ๊ณต๋ฐฑ์ด ์ƒ๊ธด๋‹ค. ๋ฌธ์ œ๋Š” ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํƒญ ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ๊ณต๋ฐฑ 1๋ฌธ์ž๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํƒญ ๋ฌธ์ž๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ž์‹ ๊ณผ ๋‹ค๋ฅธ ํƒญ ์„ค์ •์„ ๊ฐ€์ง„ ์—๋””ํ„ฐ์—์„œ ์ฝ”๋“œ๋ฅผ ์—ด์–ด ๋ณผ ๊ฒฝ์šฐ ์ฝ”๋“œ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋†’์€ ํ™•๋ฅ ๋กœ ๋ง๊ฐ€์ ธ ๋ฒ„๋ฆฌ๊ณ , ๊ทธ๊ฑธ ๊ต์ •ํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ๋“ค์—ฌ์“ฐ๊ธฐ์— ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ํ˜ผ์šฉํ•˜๋Š” ์ˆœ๊ฐ„ ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ๋Š” ์‚ฌ๋žŒ์ด ๊ณ ์น  ์ˆ˜ ์—†๋Š” ํ˜•ํƒœ๋กœ(์‹œ๊ฐ์ ์œผ๋กœ๋Š” ๋ธ”๋ก์ด ๋งž์ง€๋งŒ ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋‹ค๋ฅธ ๋ธ”๋ก์œผ๋กœ ์ธ์‹) ๋ง๊ฐ€์ ธ ๋ฒ„๋ฆฐ๋‹ค. PEP-8์— ๋ช…์‹œ๋œ ๊ณต์‹ ์ฝ”๋”ฉ ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ŠคํŽ˜์ด์Šค ๋ฐ”๋กœ ๊ณต๋ฐฑ 4๋ฌธ์ž๋ฅผ ๋„ฃ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก  ์ด๋ ‡๊ฒŒ ์ŠคํŽ˜์ด์Šค ๋ฐ”๋ฅผ ๋„ค ๋ฒˆ์ด๋‚˜ ์น˜๋Š” ๊ท€์ฐฎ์€ ํ–‰์œ„๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๊ฐ€๋งŒ ๋†”๋‘˜ ๋ฆฌ๊ฐ€ ์—†๋‹ค. PyCharm, VSCode ๋“ฑ Python ๊ฐœ๋ฐœ์ž๋“ค์ด ์• ์šฉํ•˜๋Š” ์ตœ์‹  ์—๋””ํ„ฐ๋Š” Tab์„ ๋ˆ„๋ฅด๋ฉด ๊ณต๋ฐฑ 4๊ฐœ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜์—ฌ ์ž…๋ ฅ๋˜๋Š” ๊ธฐ๋Šฅ์ด ์ง€์›๋˜๋ฏ€๋กœ ์ด๋“ค ์—๋””ํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ณต๋ฐฑ 4๊ฐœ๋ฅผ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์น  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

์›ƒ๊ธด๊ฑด Python 2๋Š” Tab ํ‚ค๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. ํƒญ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ์„ ์š”๊ตฌํ•˜๋Š” ๊ฑด Python 3์—์„œ ํ•ด๋‹นํ•˜๋Š” ์ด์•ผ๊ธฐ. ๋ฌผ๋ก  Python 2์—์„œ๋„ "Tab ํ‚ค๋ฅผ ์“ธ ๊ฒฝ์šฐ์—๋Š” ์žŠ์–ด๋ฒ„๋ฆฌ์ง€ ๋ง ๊ฒƒ"์„ ์ด์•ผ๊ธฐํ•˜๊ธด ํ•˜๋‚˜, ๊ทธ๋ ‡๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ Tab ํ‚ค๋ฅผ ๋ง‰์•˜์–ด์•ผ ๋ง์ด ๋œ๋‹ค. ์ฒจ์—๋Š” ํƒญ์ด ๊ทธ๋ ‡๊ฒŒ ๋˜ฅ์ธ์ค„ ๋ชฐ๋ž์–ด.... PyCharm ๋“ฑ์˜ ์ฃผ์š” ์—๋””ํ„ฐ์—๋Š” ํƒญ ํ‚ค๋ฅผ ์ผ๋Š”์ง€ ์ŠคํŽ˜์ด์Šค ๋ฐ”๋ฅผ ์ผ๋Š”์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์ฐธ๊ณ ํ•˜์ž.

์ฐธ๊ณ ๋กœ ์œ„์˜ ์˜ˆ์‹œ์ธ ํŒฉํ† ๋ฆฌ์–ผ ํ•จ์ˆ˜๋Š” (๋žŒ๋‹ค์‹๊ณผ ternary operator๋ฅผ ์ด์šฉํ•ด) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๊ฒฐํžˆ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์‹ค ์ด ์ฝ”๋“œ๋Š” PEP-8 ์œ„๋ฐ˜์ด๋‹ค.
factorial = lambda x: 1 if x == 0 else x * factorial(x - 1)
C์™€ Java์—์„œ ์“ฐ์ด๋Š” ternary operator ?:์— ๋น„ํ•ด ํ›จ์”ฌ ์ง๊ด€์ ์œผ๋กœ ์ฝํ˜€, '์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์‚ฌ์ฝ”๋“œ'๋ผ๋Š” ๋ณ„๋ช…์„ ์—ฌ๊ธฐ์„œ๋„ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์ณ์•ผ ํ•  ๋ฌธ์ž ์ˆซ์ž๊ฐ€ ๋ช‡ ๋ฐฐ๋กœ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ซ์–ดํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—„์ฒญ๋‚˜๊ฒŒ ๊ทนํ˜ํ•œ๋‹ค.

2.2. ์ˆœ์ˆ˜ ๊ฐ์ฒด์ง€ํ–ฅ[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์—๋Š” ์›์‹œ ํƒ€์ž…(Primitive Type)์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๋‚˜์•„๊ฐ€ ํด๋ž˜์Šค, ํ•จ์ˆ˜ ์—ญ์‹œ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์ˆ˜ ์—ญ์‹œ ์ƒ์ˆ˜๊ฐ€ ์ €์žฅ๋œ ๊ฐ์ฒด๋ผ๊ณ  ๋ณธ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์ˆ˜ ํ• ๋‹น๋ฌธ์ด ์žˆ์„ ๋•Œ,
x = 10

์ด๋Š” ๋ณ€์ˆ˜ x ์ž์ฒด์— 10์ด ํ• ๋‹น๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ x๊ฐ€ 10์ด ์ €์žฅ๋œ ์ƒ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” C์˜ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ๋™์ž‘์ด ํ–‰ํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ x์— ๋Œ€์ž…๋˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ,
x = 10
x = 20

x๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด 10์ด ์ €์žฅ๋œ ์ƒ์ˆ˜ ๊ฐ์ฒด์—์„œ 20์ด ์ €์žฅ๋œ ์ƒ์ˆ˜ ๊ฐ์ฒด๋กœ ๋ฐ”๋€ ๊ฒƒ์ด๋‹ค. x ์ž์ฒด์˜ ๊ฐ’์ด 10์—์„œ 20์œผ๋กœ ๋ฐ”๋€ ๊ฒŒ ์•„๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ ๋ฒ„์ „ 3์˜ ํ‘œ์ค€ ํƒ€์ž… ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ์ฃผ์š” ์ž๋ฃŒํ˜•์€ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. ์ด ์ค‘์—์„œ๋„ ํฌ๊ฒŒ ๋ถˆ๋ณ€ ๊ฐ์ฒด(Immutable Object)์™€ ๊ฐ€๋ณ€ ๊ฐ์ฒด(Mutable Object)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ๋ถˆ๋ณ€ ๊ฐ์ฒด์—๋Š” ์ƒ์ˆ˜(์ˆซ์ž), ๋ฌธ์ž์—ด, ๋ฐ”์ดํŠธ, ๊ทธ๋ฆฌ๊ณ  ํŠœํ”Œ[6]์ด ์žˆ๋‹ค. ์ด ๋„ค ๊ฐ€์ง€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ๊ฐ€๋ณ€ ๊ฐ์ฒด์ด๋ฉฐ, ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ๋•Œ๋Š” ๋ฐ”๋€ ๊ฐ’์ด ์ €์žฅ๋œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฐธ์กฐ ๋Œ€์ƒ์„ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์˜ฎ๊ธฐ๋Š” ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ํŠน์ง• ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์€ ์ˆœ์ˆ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด์™€ ๊ฐ™์€ ์ˆœ์ˆ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ ๋˜๋‹ค๋ฅธ ์˜ˆ๋กœ๋Š” Ruby๊ฐ€ ์žˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒผ๋ƒ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒผ๋ƒ์— ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๋ฐ”๊นฅ์— ์žˆ๋Š” ์ธ์ž์˜ ๊ฐ’๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋ถˆ๋ณ€๊ฐ์ฒด๋ฅผ ๋„˜๊ฒผ์œผ๋ฉด ๊ฐ’์˜ ๋ณต์‚ฌ๋งŒ ์ผ์–ด๋‚˜๊ณ  ํ•จ์ˆ˜ ๋ฐ”๊นฅ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฏ€๋กœ[7] '๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ(Call by Value)'์ด ๋  ๊ฒƒ์ด๋ฉฐ, ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒผ์œผ๋ฉด ํ•จ์ˆ˜ ๋ฐ”๊นฅ์—๊นŒ์ง€ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ '์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ(Call by Reference)'์ด ๋  ๊ฒƒ์ด๋‹ค. ํŒŒ์ด์ฌ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ํŒŒ์ด์ฌ์˜ ์ธ์ž ์ „๋‹ฌ ๋ฐฉ์‹์„ 'ํ• ๋‹น์— ์˜ํ•œ ํ˜ธ์ถœ(Call by Assignment)', ๋˜๋Š” '๊ฐ์ฒด ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ(Call by Object Reference)'์ด๋ผ๊ณ  ๋ช…์‹œํ•˜๊ณ  ์žˆ๋‹ค.

2.3. ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜. ํŒŒ์ด์ฌ์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด(iterable)๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์ง‘ํ•ฉ, ๋ฌธ์ž์—ด, ๋ฆฌ์ŠคํŠธ, ํŠœํ”Œ, ๋”•์…”๋„ˆ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜[8]๊นŒ์ง€๋„ ๋ฐ˜๋ณต์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๊ฒƒ์„ for ๊ตฌ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋ฆฌ์ŠคํŠธ์™€ ํŠœํ”Œ ๋“ฑ์€ ์ข€ ํŽธํ•ด์ง€๋Š” ์ •๋„๋ผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•จ์ˆ˜์˜ ๊ฐ’์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ํฐ ์žฅ์ ์ด๋‹ค. ๊ทธ ์˜ˆ๋กœ n์˜ ๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” f(n) ํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ,

def f(n):
    x = 1
    while 1:
        yield n*x
        x += 1

ot = f(2)
print ot
print next(ot)
print next(ot)

์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ๋„ ํ•จ์ˆ˜๊ฐ€ ์™„์ „ํžˆ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์•ผ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์‚ญ์ œ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค x์˜ ๊ฐ’์ด ์ฆ๊ฐ€ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋Š” __next__ ํ•จ์ˆ˜๋‚˜ next(๊ฐ์ฒด) ํ•จ์ˆ˜, ๋˜๋Š” for ... in ๊ฐ์ฒด ์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•๋“ค์„ ์ด์šฉํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ’์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํ˜ธ์ถœ ๋  ๋•Œ ๋ฐ˜ํ™˜๊ฐ’์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฉด์—์„œ๋„ ์ด์ ์ด ์žˆ๋‹ค.

3. ์žฅ์ [ํŽธ์ง‘]

3.1. ๋†’์€ ์ƒ์‚ฐ์„ฑ[ํŽธ์ง‘]


ํŒŒ์ด์ฌ์˜ ์•„์ด๋ดํ‹ฐํ‹ฐ. ๊ทธ ๋ฌด์—‡๊ณผ๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ํŒŒ์ด์ฌ๋งŒ์˜ ํŠน์ง•์ด๋‹ค. ์ „ ์„ธ๊ณ„์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ค‘์—์„œ ํŒŒ์ด์ฌ ์ •๋„์˜ ๋‚ฎ์€ ๋‚œ์ด๋„๋ฅผ ๊ฐ€์ง€๋ฉด์„œ, ๋ฒ”์šฉ์„ฑ์„ ๊ฐ–์ถ”๊ณ , ํŒŒ์ด์ฌ ์ˆ˜์ค€์˜ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋”ฐ๋ผ์žก๋Š” ์–ธ์–ด๊ฐ€ ์—†๋‹ค. ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ Java๋‚˜ C++๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋Š” ์ˆœ๊ฐ„ ์ˆจ์ด ํ„ฑ ๋ง‰ํž ์ •๋„. ์ด๋Ÿฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ค๊ณ„๋ถ€ํ„ฐ ๋‚œ๊ฐํ•ด์ง„๋‹ค.

์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ด๋ฉด์„œ ์šฐ์ˆ˜ํ•œ ์ž๋ฃŒํ˜•๊ณผ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ๋“ฑ์„ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ๊ธฐ๊ฐ„์ด ๋‹จ์ถ•๋˜๋Š” ๊ฒƒ์ด ํŠน์ง•. 'C์–ธ์–ด๋กœ 2๋…„๋™์•ˆ ์™„์„ฑํ•˜์ง€ ๋ชปํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ํ•œ๋‹ฌ๋งŒ์— ํ•ด๋ƒˆ๋‹ค'๋Š” ๊ทน์ ์ธ ๊ฒฝํ—˜๋‹ด์ด ์žˆ์„ ์ •๋„๋‹ค. ๋‹น์žฅ ํŒŒ์ด์ฌ์˜ ์ง‘ํ•ฉ ์ž๋ฃŒํ˜• ๊ฐ™์€ ๊ฒฝ์šฐ C์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋จธ๋ฆฌ๊ฐ€ ์•„ํŒŒ์˜จ๋‹ค. C์–ธ์–ด์™€์˜ ์ ‘์ฐฉ์„ฑ๋„ ์ข‹๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋‹จ Python์œผ๋กœ ๋นจ๋ฆฌ ๊ตฌํ˜„ํ•˜๊ณ , ๋‚จ์€ ์‹œ๊ฐ„์— ์†๋„์— ๋ณ‘๋ชฉ์ด ๋˜๋Š” ๋ถ€๋ถ„์„ C++๋กœ ์ „ํ™˜ํ•˜๋Š” ์ „๋žต์„ ๋‚ด์„ธ์šฐ๊ณ  ์žˆ๋‹ค. ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ Python ์ž์ฒด๋„ ๊ทธ๋ฆฌ ๋А๋ฆฌ์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹ฌ์ง€์–ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ๊ฐ™์€ ์ €์ˆ˜์ค€ ์–ธ์–ด(Low level)๋„ Python์—์„œ ํ˜ธ์ถœ ํ• ์ˆ˜์žˆ๋‹ค. Python์€ ์–ด์ง€๊ฐ„ํ•œ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์„ ์ง€์›ํ•˜๋Š” ํ˜ธํ™˜์„ฑ, ์‘์šฉํ•  ๊ณณ์ด ๋ฌด๊ถ๋ฌด์ง„ํ•˜๋‹ค. ์‹คํ–‰ ์†๋„๋งŒ ๋นผ๊ณ 

์ฐธ๊ณ ๋กœ ์ € geek ๊ฐ์„ฑ์˜ ์žฌ๋ฏธ์—†๋Š” ๋งŒํ™”๋Š” ํŒŒ์ด์ฌ ๋‚ด์— ์ด์Šคํ„ฐ ์—๊ทธ๋กœ ์‚ฝ์ž…๋˜๊ธฐ๋„ ํ–ˆ๋‹ค. import antigravity๋กœ antigravity ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋‚˜์˜จ๋‹ค.์˜์ƒ

3.2. ๋ฌธ๋ฒ• ํ†ต์ผ์— ๋”ฐ๋ฅธ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ[ํŽธ์ง‘]

๋””์ž์ธ ์ฒ ํ•™ ์ž์ฒด๊ฐ€ ๊ฐ€์žฅ ์™„๋ฒฝํ•œ ํ•˜๋‚˜์˜ ์•„๋ฆ„๋‹ค์šด ํ•ด๋‹ต์„ ์ฐพ๋Š” ํŒŒ์ด์ฌ ํŠน์œ ์˜ ์ฒ ํ•™์„ ์ฐพ๋‹ค ๋ณด๋‹ˆ, ๋ฌธ๋ฒ• ์ž์ฒด๊ฐ€ ๋”ฑ ๋–จ์–ด์ง€๊ฒŒ ํ‘œํ˜„๋œ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ œ์•ˆํ•˜๊ณ  ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ณด๊ณ  ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. Perl ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” Write Once, Read Never๋ผ๊ณ  ๋ถˆ๋ฆด ์ •๋„๋กœ ํ”ผ๋“œ๋ฐฑ๊ณผ๋Š” ๋‹ด์„ ์Œ“์•˜๋Š”๋ฐ, ํŒŒ์ด์ฌ์€ ๋ฌธ๋ฒ•์ด ํ†ต์ผ๋˜์–ด ์žˆ๋‹ค ๋ณด๋‹ˆ Write Once, Read Infinity๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋žจ ํ•˜๋‚˜ ๋งŒ๋“ค๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์— ์˜ํ•ด ์—„์ฒญ๋‚œ ์–‘์˜ ํ”ผ๋“œ๋ฐฑ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋Š” ๊ณง ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์œผ๋กœ๋„ ์ด์–ด์กŒ๋‹ค. ๊ดœํžˆ ํŒŒ์ด์ฌ์ด ์‹œ๊ฐ„์ด ๊ฐˆ์ˆ˜๋ก ์ ์œ ์œจ์ด ์ƒ์Šนํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด๋‹ค.

3.3. ๊ณผํ•™/๊ณตํ•™ ์นœํ™”[ํŽธ์ง‘]

Python์€ ๊ณผํ•™๊ณผ ๊ณตํ•™ ๋ถ„์•ผ์—์„œ ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์šฐ์„  ์–ธ์–ด ์ž์ฒด์ ์œผ๋กœ 64๋น„ํŠธ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๋งค์šฐ ํฐ ์ •์ˆ˜๋ฅผ ์ง€์›ํ•œ๋‹ค.[9][10] ๋˜ํ•œ ํ—ˆ์ˆ˜๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ decimal, fractions ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์†Œ์ˆซ์ ๊ณผ ์œ ๋ฆฌ์ˆ˜๋ฅผ ์ •๋ฐ€ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฃจ๋Š” ์•”ํ˜ธํ•™๊ณผ ํ†ต๊ณ„ ๋ถ„์•ผ์—์„œ ์“ฐ๊ธฐ์— ์•Œ๋งž๋‹ค.

Python ์ƒํƒœ๊ณ„ ๋˜ํ•œ ๊ณตํ•™ ๋ฐ ๊ณผํ•™ ๋ถ„์•ผ๋ฅผ ๋นต๋นตํ•˜๊ฒŒ ์ง€์›ํ•œ๋‹ค. ๋ณต์žกํ•œ ์ˆ˜์น˜์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์—ฐ์‚ฐ์— ์•Œ๋งž์€ NumPy, SciPy, pandas, ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” Matplotlib, ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” Jupyter Notebook ๋“ฑ์˜ ๊ฐ•๋ ฅํ•œ ํŒจํ‚ค์ง€์™€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Python ๊ฐœ๋ฐœ์ž๋“ค๋„ ์ด๋Ÿฌํ•œ ์‚ฌ์‹ค์„ ์ž˜ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์–ด ์ฐจ์›์—์„œ ๊ด€๋ จ ํŒจํ‚ค์ง€๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ€๋ น Ellipsis (...) ์ƒ์ˆ˜๋Š” ์‚ฌ์‹ค์ƒ NumPy ์ „์šฉ์˜ ์Šฌ๋ผ์ด์Šค ๊ฐ์ฒด๋กœ ์ œ๊ณตํ•œ๋‹ค.[11] ๋˜ํ•œ 3.5๋ถ€ํ„ฐ๋Š” ํ–‰๋ ฌ๊ณฑ์„ ์œ„ํ•œ @ ์—ฐ์‚ฐ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

3.4. ๋งŒ๋Šฅ ์–ธ์–ด[ํŽธ์ง‘]

PyPI#๋ผ๋Š” ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ๊ฐ€ 2012๋…„ ๊ตฌ์ถ•๋˜์—ˆ๋‹ค. 2018๋…„ 10์›” ๊ธฐ์ค€ 155,800 ์—ฌ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์—ฌ๊ธฐ์— ๋“ฑ๋ก๋œ ํŒจํ‚ค์ง€๋“ค์€ pip#๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚ด๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, PyPI๊ฐ€ ์ตœ์ดˆ, ์ตœ๋Œ€์˜ ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ๋Š” ์•„๋‹ˆ๋‹ค.

Python์œผ๋กœ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๊ฑฐ๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์˜ Wrapper๊ฐ€ ๊ผญ ์กด์žฌํ•œ๋‹ค. ์‚ฌ์‹ค์ƒ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ์—†๋‹ค. ์›น ์‚ฌ์ดํŠธ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด Python Web Framework๋ฅผ ์ณ๋ณด์ž(Django, Flask, Bottle ๋“ฑ). ๊ธฐ๊ณ„ํ•™์Šต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด python machine learning์ด๋ผ ๊ฒ€์ƒ‰ํ•˜์ž(scikit-learn). ์–ผ๊ตด์ธ์‹์„ ์ฝ”๋“œ ๋ช‡ ์ค„๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค(OpenCV). ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜๋Š” ๋ชจ๋“ˆ์ธ tkinter ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ์ž„๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค(Pygame). ๋น„์ฃผ์–ผ ๋…ธ๋ฒจ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค(Ren'Py).

Python ๊ฐ€์ง€๊ณ  ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊นŒ์ง€ ๋งŒ๋“œ๋Š” ๊ดด์ˆ˜๋“ค๋„ ์žˆ๋‹ค. Python์œผ๋กœ SQL์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์†Œ๋ฆฌ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์šฐ๋ฆฌ์˜ Nerd๋“ค์€ ํ•ด๋‚ด๊ณ  ๋ง์•˜๋‹ค. 2013๋…„ Python์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” DB ๊ฐœ๋…์ด ์žกํžŒ ์ดํ›„ ์ˆ˜๋งŽ์€ ํ”ผ๋“œ๋ฐฑ ๋์— 2015๋…„ ๋„์ „ ์„ฑ๊ณต. ์‹ฌ์ง€์–ด 2017๋…„ ํ”„๋ž‘์Šค์˜ ์ค‘๊ฒฌ๊ธฐ์—…์—์„œ Python DB ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋”๋‹ˆ ์ •๋ง๋กœ ํšŒ์‚ฌ์˜ DB๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์—…์„ ๋ฒŒ๋ ค์„œ DBํ™”๋˜์ง€ ๋ชปํ•˜๊ณ  ์ €์žฅ๋˜๋˜ ํšŒ์‚ฌ ๋‚ด๋ถ€์˜ ํŒŒ์ผํ˜• ์ž๋ฃŒ๋“ค๊ณผ ๊ธฐ์กด์˜ DB์— ์ €์žฅ๋œ ์ž๋ฃŒ๋ฅผ ์ ‘ํ•ฉ์‹œํ‚ค๋Š” ์‚ฌ์—…๊นŒ์ง€ ํ–ˆ๋‹ค ํ•œ๋‹ค.

๋ฌผ๋ก  ๊ทธ๋ ‡๋‹ค๊ณ  Python๋งŒ ์“ฐ๋Š” ๊ฒƒ์ด ๋‹ต์€ ์•„๋‹ˆ๋‹ค. ์‹คํ–‰ ์†๋„(์ •ํ™•ํžˆ๋Š” CPython์˜ ์‹คํ–‰ ์†๋„)๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ํŽธ์ด๋ผ, ๋น ๋ฅธ ์†๋„๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” C, C++๋ณด๋‹ค๋Š” ๋‹น์—ฐํžˆ ๋А๋ฆฌ๊ณ , Lua, JavaScript, LISP ๊ณ„์—ด ์–ธ์–ด ๋“ฑ ๋™์  ์–ธ์–ด๋“ค์„ ์ „์ฒด๋ฅผ ์ฃผ์šฑ ๋†“๊ณ  ๋น„๊ตํ•ด ๋ด๋„ ์†๋„๊ฐ€ ๋น ๋ฅธ ํŽธ์€ ์•„๋‹ˆ๋‹ค. Python์ฒ˜๋Ÿผ ๊ฐ€์ƒ ๋จธ์‹  ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” Java, JavaScript ๋“ฑ์˜ ์–ธ์–ด๋“ค์˜ ๊ฒฝ์šฐ, ์†๋„ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋„์ž…ํ–ˆ๋‹ค. Python์˜ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€ ๊ตฌํ˜„์ฒด์ธ CPython์€ JIT ์ปดํŒŒ์ผ์„ ๋„์ž…ํ•˜์ง€ ์•Š์•˜๊ณ , JIT ์ปดํŒŒ์ผ์„ ๋„์ž…ํ•œ ๋ณ„๋„์˜ ๊ตฌํ˜„์ฒด์ธ PyPy๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค. ํ†ต๊ณ„ ๋ถ„์•ผ ๋“ฑ ํŠน์ • ๋ถ„์•ผ์—์„œ๋Š” R๊ณผ ๊ฐ™์ด ๊ทธ ๋ถ„์•ผ์— ํŠนํ™”๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋™์  ํƒ€์ž… ์–ธ์–ด(dynamically typed language)๋ผ๋Š” ์ ์ด ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹จ์ ์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ์ž๋ฃŒ๊ตฌ์กฐ ์„ค๊ณ„๋‚˜ ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค๋Š” ์ง€์ ๋„ ์žˆ๋‹ค. ๋‹ค๋งŒ "์ •์  ํƒ€์ž… vs. ๋™์  ํƒ€์ž…" ๋…ผ์Ÿ์€ ์„œ๋กœ์˜ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ์ผ์ข…์˜ ์ข…๊ต ๋…ผ์Ÿ์œผ๋กœ ์ทจ๊ธ‰ ๋ฐ›๋Š”๋‹ค. ์ผ๋ก€๋กœ OCaml ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ธํ„ฐํŽ˜์ด์Šค(Hindley-Milner, System F ๋“ฑ)๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ, ๋ชจ๋“  ํƒ€์ž… ์—๋Ÿฌ(!)๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด์—, ๋ชจ๋“  ๋ฒ„๊ทธ๊ฐ€ ํƒ€์ž… ์—๋Ÿฌ๋Š” ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น… ๊ณผ์ •์€ ํ•„์š”ํ•˜๋ฉฐ, ํƒ€์ž… ์‹œ์Šคํ…œ์œผ๋กœ ์ธํ•œ ๋ถ€๋‹ด ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๊ตฌํ˜„์—๋Š” ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋™์  ์–ธ์–ด๋Š” ๋น ๋ฅธ ๊ตฌํ˜„์˜ ์ด์ ์ด ์žˆ์ง€๋งŒ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋งŽ์ด ๋‚˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ํ•œ ๋งˆ๋””๋กœ, ์ปดํŒŒ์ผ ์–ธ์–ด์˜ ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ. Python์œผ๋กœ parser๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•ด๋ดค๋‹ค๋ฉด, ์‹ญ์ค‘ํŒ”๊ตฌ ์ฝ์€ ์ˆซ์ž๋ฅผ string์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์—ฐ์‚ฐ์„ ํ–ˆ๋”๋‹ˆ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜ ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋†’์€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ์–ด๋А ์ •๋„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ตœ๊ทผ์˜ ์ถ”์„ธ์™€ ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋˜ํ•œ Python 3.5๋ถ€ํ„ฐ๋Š” Type Hints๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์€ ์•ˆ๋˜์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ PyCharm๊ณผ ๊ฐ™์€ IDE ํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•˜๋ฉด ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๋น ๋ฅธ ์•„์ด๋””์–ด ๊ตฌํ˜„์ด ์ƒ๋ช…์ธ ์—ฐ๊ตฌ์†Œ์—์„œ ๊ฐ๊ด‘์„ ๋ฐ›๊ณ  ์žˆ๊ณ , ํ•œ๊ตญ ๋ฐ–์—์„œ๋Š” ๋‹น๋‹นํ•œ ์ฃผ๋ฅ˜ ์–ธ์–ด๋กœ ๋Œ€์šฐ๋ฐ›๊ณ  ์žˆ๋‹ค. ์ธ์Šคํƒ€๊ทธ๋žจ, ์œ ํŠœ๋ธŒ, reddit ๋“ฑ์ด Python์„ ์ฃผ๋กœ ์“ฐ๊ณ  ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ์™ธ๊ตญ์˜ ๊ตฌ์ธ ์‚ฌ์ดํŠธ์—๋„ Python์„ ํ•  ์ค„ ์•„๋Š” ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ๋งŽ๋‹ค. ์ปดํ“จํ„ฐ ๊ด€๋ จ์ด ์•„๋‹Œ ์ด๊ณต๊ณ„ ์ „๋ฐ˜์—์„œ ๋งŽ์ด ์“ฐ์ด๋Š” MATLAB์€ ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์ด ์ตœ๊ทผ ์ถ”์„ธ์™€ ๋งž์ง€ ์•Š์•„ ์ž…์ง€๊ฐ€ ์ข์•„์ง€๊ณ  ์žˆ๋‹ค.[12] CG ์—…๊ณ„์—์„œ๋„ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ด๋‹ค. MEL, MAXScript ๋“ฑ ํˆด๋ณ„๋กœ ์ž์ฒด ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋“ค์ด ๋‚œ๋ฆฝํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ํ˜„์žฌ๋Š” Python ์Šคํฌ๋ฆฝํŒ…์„ ์ฃผ๋ ฅ์œผ๋กœ ๋ฐ€๊ณ  ์žˆ๋‹ค.

์š”์ฆ˜์€ ๊ฐ€ํžˆ ์ถ˜์ถ”์ „๊ตญ์‹œ๋Œ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ƒˆ๋กœ์šด ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ณ„์† ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์•„์˜ˆ ํด๋ฆฌ๊ธ€๋กฏ(Polyglot[13]) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ์‹œ๋Œ€๋‹ค. ๋‹น์žฅ ๊ตฌ๊ธ€๋งŒ ํ•ด๋„ C++, Java, Python์„ ๊ณจ๊ณ ๋ฃจ ์„ž์–ด์„œ ์“ด๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ๊ฒŒ์ž„๋„ ๋ฉ”์ธ์€ C++๋กœ ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ ์Šคํฌ๋ฆฝํŒ…์€ Python์ด๋‚˜ Lua๋กœ ๋œ ๊ฒฝ์šฐ(์‹œ๋“œ ๋งˆ์ด์–ด์˜ ๋ฌธ๋ช…, WOW ๋“ฑ)๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ๋งค์šฐ ๋Šฅ์ˆ™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋ฉฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋””์ž์ธ ํŒจํ„ด, ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ•, ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ, ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค) ๋“ฑ์˜ ํ•„์š”ํ•œ ์ง€์‹์„ ํ›คํ•˜๊ฒŒ ๊ฟฐ๊ณ  ์žˆ์–ด์•ผ ์ œ๋Œ€๋กœ ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ/๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

Python์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ณณ๋„ ์žˆ๋‹ค! Awesome Python

3.5. ๊ต์œก[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์€ ์œ„์˜ ํŠน์ง• ๋•Œ๋ฌธ์— ๊ต์œก์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ฐ๊ด‘๋ฐ›๊ณ  ์žˆ๋‹ค. ํ•œ๊ตญ, ๋ฏธ๊ตญ์˜ ์—ฌ๋Ÿฌ ๋Œ€ํ•™๊ต ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต์œก๋“ค์€ ๊ฐœ๋ก  ์ˆ˜์—… ์–ธ์–ด๋ฅผ C, C++๋‚˜ Java์—์„œ Python์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ€๋Š” ์ถ”์„ธ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ Python์ด ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฑด ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ž…์žฅ์—์„œ ๋‚˜์˜จ ๋ง์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋งˆ์ €๋„ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ๋น„๊ต์ ์œผ๋กœ ์‰ฝ๋‹ค๋Š” ๋œป์ด์ง€, ๊นŠ๊ฒŒ ํŒŒ๊ณ  ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ํŠน์œ ์˜ 'ํŒŒ์ด์ฌ์Šค๋Ÿฌ์›€(pythonic)'ํ•œ ์ฝ”๋”ฉ์„ ํ•˜๋ ค๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์‹ ๊ฒฝ์“ธ ๊ฒƒ๋„ ๋งŽ๊ณ  ๋™์  ์–ธ์–ด์— ์ต์ˆ™ํ•ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”์šฑ์ด ์ปดํŒŒ์ผ๋Ÿฌ ์—†์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๊ฒƒ์€ ๊นก์ดˆ๋ณด์—๊ฒŒ ๊ถŒ์žฅํ•  ๋งŒํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฒŒ, ์ •์  ์–ธ์–ด์— ๋Œ€ํ•œ ๊ฐœ๋…๋„ ์—†์ด ๋™์  ์–ธ์–ด๋ฅผ ์žก์•˜๋‹ค๊ฐ€๋Š” ์˜คํžˆ๋ ค ๋” ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์™œ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ TypeScript๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ์ž ์‹œ ์ƒ๊ฐํ•ด ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค. ๋”์šฑ์ด ํŒŒ์ด์ฌ์€ ํŽธ์ง‘์ฆ์ด ์˜์‹ฌ๋  ์ •๋„๋กœ ๊ฐ์ฒด ์œ„์ฃผ๋กœ ๋Œ์•„๊ฐ€๊ธด ํ•˜์ง€๋งŒ, ์–ธ์–ด์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋ณด๋ฉด ์ ˆ์ฐจ์ง€ํ–ฅ, ๊ฐ์ฒด์ง€ํ–ฅ, ํ•จ์ˆ˜ํ˜• ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋‹ค. ๊ทน๋‹จ์ ์œผ๋กœ OOP๋ฅผ ์ง€ํ–ฅํ•˜๋Š” Java๋‚˜ C#๋ณด๋‹ค[14] ๋” ์‹ ๊ฒฝ์จ์•ผ ํ•  ๊ฒƒ์ด ๋งŽ๋‹ค๋Š” ์ด์•ผ๊ธฐ. ํ•˜์—ฌํŠผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด๋ฅผ ๋งˆ๋ƒฅ ์‰ฌ์šด ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋‹ค๋ฉด ํฐ ์ฝ” ๋‹ค์นœ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ข‹๊ฒŒ ํ•˜๋Š” ๊ฒƒ์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฉฐ, '์ข‹์€' ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์—ญ๋Ÿ‰์— ํฌ๊ฒŒ ์ขŒ์šฐ๋œ๋‹ค.

4. ๋ฌธ์ œ์ [ํŽธ์ง‘]

ํŒŒ์ด์ฌ์€ ์‹œ์Šคํ…œ์„ ๊ฑด๋“œ๋ฆฌ๊ฑฐ๋‚˜ ๋ฐ˜๋ณต์—ฐ์‚ฐ์ด ๋งŽ์€ ๊ฒƒ์€ ํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ python num ์ฒ˜๋Ÿผ ๋”ฐ๋กœ ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ฒŒ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†๋‹ค(๊ทธ๋ž˜๋„ python num์„ ์‚ฌ์šฉํ•ด๋„ ๋А๋ฆฐ๊ฑด ๋А๋ฆฌ๋‹ค;;).
์ด ๋‹จ์ ์€ ๋ฐ˜๋ณต ์—ฐ์‚ฐ์ด ์žˆ๋Š” C๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.

4.1. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ถˆ๊ฐ€ ๋ฌธ์ œ[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ GIL(Global Interpreter Lock), ์ฆ‰ ์ „์—ญ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฝ์„ ๋„์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ, python ์Šค๋ ˆ๋“œ 10๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด๋„ ์‹ค์ œ Pthread/์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ๊ฐ€ 10๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธด ํ•˜๋Š”๋ฐ, GIL๋•Œ๋ฌธ์— ๊ฐœ์ค‘ ๋™์‹œ์— ํ•˜๋‚˜๋ฐ–์— ์•ˆ๋Œ์•„๊ฐ€๋Š” ๊ธฐ์ดํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก , ๋‚ด๋ถ€์ ์œผ๋กœ IO์ž‘์—…์ด ์žˆ์„ ์‹œ ๋ฐ”๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ๋ฌธ๋งฅ ๊ตํ™˜์„ ํ•ด์ฃผ๊ณ , ๋ฐ”์ดํŠธ ์ฝ”ํŠธ๋ฅผ 100๋ฒˆ ์‹คํ–‰ํ•œ ๋‹ค์Œ์—๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ฐจ์›์—์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ๊ต์ฒด ํ•ด์ฃผ๋ฏ€๋กœ ๋™์‹œ ์ž‘์—… ๋น„์Šทํ•œ ํšจ๊ณผ๊ฐ€ ๋‚œ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„์ด ๋งค์šฐ ์‰ฌ์›Œ์ง€๊ณ  ๋น ๋ฅธ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ๋‹ค์ค‘ ์ฝ”์–ด CPU๊ฐ€ ๋ณดํŽธํ™”๋œ 2006๋…„ ์ดํ›„์—๋Š” ๋‹ค์ค‘ ์ฝ”์–ด๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์—์„œ ๋ฐ€๋ฆฐ๋‹ค๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค. ๋งŒ์ผ ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์— ์ˆœ์ง„ํ•˜๊ฒŒ CPU ์ฝ”์–ด๋ฅผ 2๊ฐœ ์ด์ƒ ๋™์›ํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ, ๋ฎคํ…์Šค(MutEx), ์ฆ‰ ํ•œ ์Šค๋ ˆ๋“œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ CPU๊ฐ€ ์—ฐ์‚ฐ์„ ํ–‰ํ•˜์—ฌ ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ์˜ค์—ผ ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ์„ ๋งก๋Š” GIL์ด ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผ์ผœ ์ฝ”์–ด ํ•˜๋‚˜๋ฅผ ์“ธ ๋•Œ๋ณด๋‹ค ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋œ๋‹ค๋Š” ๊ฒƒ. ๊ตฌ๊ธ€ ๋‚ด๋ถ€์—์„œ ์ด๋ฏธ ๊ฐ€๋ฃจ๊ฐ€ ๋˜๋„๋ก ๊นŒ์ธ ๋ถ€๋ถ„์ด๋‹ค.

๋”๋ถˆ์–ด, ์˜ˆ์ „์˜ Python์—๋Š” CPU-boundํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ I/O-boundํ•œ ์Šค๋ ˆ๋“œ์™€ ํ•จ๊ป˜ ๋Œ์•„๊ฐˆ ๋•Œ, I/O-boundํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์ƒํ™ฉ์—์„œ๋„ context switch๊ฐ€ ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— CPU-bound ์Šค๋ ˆ๋“œ๊ฐ€ GIL์„ ์ง€๋‚˜์น˜๊ฒŒ ์˜ค๋ž˜ ์ ์œ ํ•˜๊ฒŒ ๋˜๋ฉด์„œ I/O ๋ฐ˜์‘ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” GIL์„ ํš๋“ํ•˜๋ ค๊ณ  ๊ณ„์† ์‹œ๋„ํ•˜๋А๋ผ CPU ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ํŒŒ์ด์ฌ ์ „๋ฌธ๊ฐ€์ธ David Beazley๊ฐ€ 2009๋…„์— Mindblowing Python GIL์ด๋ผ๋Š” ๊ฐ•์—ฐ์—์„œ ์ง€์ ํ•˜์˜€๋‹ค.[15] ์ดํ›„ Antoine Pitrou๋ผ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ GIL์„ ๋œฏ์–ด๊ณ ์ณ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๊ณ , Python 3.2๋ถ€ํ„ฐ๋Š” ์ƒˆ๋กœ์šด GIL์ด ์ ์šฉ๋˜์–ด์„œ ์„ฑ๋Šฅ์ด ์–ด๋А ์ •๋„ ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค๋กœ GIL์„ ์šฐํšŒํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. 2008๋…„ ์ดํ›„์— multiprocessing์ด๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ด ๋ชจ๋“ˆ์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์ค‘ ์ฝ”์–ด ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์„ ๊พ€ํ•˜๊ณ  ์žˆ๋‹ค.

๋‹จ, CPU ๋ถ€ํ•˜๊ฐ€ ํฐ ์ž‘์—…์„ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด GIL์„ ์ฒด๊ฐํ•˜๊ธฐ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š๋‹ค. ๋‹ค์ค‘ ์Šค๋ ˆ๋”ฉ์œผ๋กœ CPU์˜ ์—ฌ๋Ÿฌ ์ฝ”์–ด๋ฅผ ์ตœ๋Œ€ํ•œ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” GIL๊ฐ€ ๊ต‰์žฅํžˆ ์•„์‰ฌ์šด ์ด์Šˆ์ง€๋งŒ, CPU๋ฅผ ๋ณ„๋กœ ์“ฐ์ง€ ์•Š๊ฑฐ๋‚˜ I/O๊ฐ€ ์ฃผ๊ฐ€ ๋˜๋Š” ์ž‘์—…์€ ์œ ์˜๋ฏธํ•œ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์–ด์„คํ”„๊ฒŒ ์ฝ”์–ด ๋ช‡๊ฐœ ๊น”์ง๊น”์ง ์ด์šฉํ•ด์„œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๊ทธ๋ƒฅ C์–ธ์–ด๋กœ ๋ชจ๋“ˆ์„ ์งœ์„œ ๋ถ™์ด๋Š” ๊ฒŒ ๋” ๋น ๋ฅด๋‹ค. ์ฆ‰, python์—์„œ CPU๋ฅผ ๋งŽ์ด ๋จน๋Š” ๋ถ€๋ถ„์€ C ๋ชจ๋“ˆ์„ ์งœ์„œ ๋ถ™์ด๊ฑฐ๋‚˜, ์ด๋ฏธ C ๋ชจ๋“ˆ๋กœ ์งœ์—ฌ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜(Numpy, Scipy ๋“ฑ), ํ•„์š”ํ•˜๋‹ค๋ฉด multiprocessing ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ํŽธ. ๊ทธ ์ด์ƒ์˜ CPU-heavyํ•œ ์ž‘์—…์€ ์ฒ˜์Œ๋ถ€ํ„ฐ C, C++๋กœ ์งœ๋Š” ๊ฒŒ ๋งž๋‹ค.

์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ๋งํฌ๋“ค์„ ์ฐธ์กฐ.(๋„ˆ๋ฌด ์˜ค๋ž˜๋œ ๋งํฌ๋“ค์ด๋ผ ์ฐจ๋ผ๋ฆฌ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ํ•ด์„œ ์ตœ๊ทผ ๊ธ€๋“ค์„ ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.)

ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ์—ฐ์‚ฐ์˜ ๋ฉ€ํ‹ฐ์ฝ”์–ด์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ณด๊ธฐ ์œ„ํ•œ ๊ฒƒ ๋ง๊ณ ๋„, I/O๊ฐ€ ์ฃผ๊ฐ€ ๋˜๋Š” ์ž‘์—…(์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ I/O ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ)์„ ์œ„ํ•ด์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ ,[16] ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ๋ณต์žกํ•œ ๋™๊ธฐํ™”๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋‚ญ๋น„์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋””๋ฒ„๊น…๋„ ํž˜๋“ค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์‹ค์ œ๋กœ๋Š” I/O๋ฅผ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์‹ค์ œ I/O๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ์›”๋“ฑํžˆ ๊ธด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž์›๋งŒ ๋‚ญ๋น„ํ•˜๋Š” ๊ผด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ Go๋‚˜ Erlang ๊ฐ™์€ ์ตœ๊ทผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์€ ์ฝ”๋ฃจํ‹ด์ด๋ž€ ๊ฐœ๋…์„ ๋„์ž…ํ•ด[17] ์ด๋Ÿฌํ•œ "event multiplexing"์„ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฐ์ข… ๋™๊ธฐํ™” ๋ฌธ์ œ ์—†์ด ๋งˆ์น˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๋“ค์ด "๋™์‹œ์—" ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•ด์ฃผ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ž…์žฅ์—์„œ ๋งค์šฐ ํŽธํ•˜๋‹ค. ์‹ค์ œ๋กœ๋Š” ๊ฐ ์ด๋ฒคํŠธ์— ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋น„๋Š” ์‹œ๊ฐ„์— ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ, ์‹œ๋ถ„ํ• ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋ฌธ๋งฅ ์ „ํ™˜์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค์Œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ํ˜‘๋ ฅ์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

C๊ฐ™์€ ์–ธ์–ด์—์„œ ์ด๋Ÿฌํ•œ ์ฝ”๋ฃจํ‹ด ์ง€์›์ด ์ž˜ ์•ˆ ๋˜๋Š” ์ด์œ ๋Š”, ์–ธ์–ด์  ์ฐจ์›์—์„œ ํ•จ์ˆ˜ ์ค‘๊ฐ„์— ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ์Šค๋ ˆ๋“œ ๋ณ„๋กœ stack์ด 1๊ฐœ๋ฐ–์— ์—†๋Š” ๊ตฌ์กฐ์—์„œ๋Š” ๊ตฌํ˜„์ด ์–ด๋ ต๊ณ  ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์งœ์•ผ ํ•  ๋‚ด์šฉ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ callback ํ•จ์ˆ˜๋กœ ์ชผ๊ฐœ๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง„๋‹ค๋Š” ๋‹จ์ ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ callbackํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ Node.js ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‹ค. ํ˜„์žฌ๋กœ์จ๋Š” ์ด๋Ÿฐ ์ฝœ๋ฐฑ ๋ฐฉ์‹์ด ์œ ์—ฐํ•˜๋ฉด์„œ ํผํฌ๋จผ์Šค๊ฐ€ ์ข‹์€ ๋ฐฉ์‹์ด์ง€๋งŒ ์–ธ์–ด์ ์œผ๋กœ ์•ฝ๊ฐ„ ๋”๋Ÿฝ๋‹ค. ์œ„์—์„œ ๊ธฐ์ˆ ํ•œ Stackless Python์—์„œ ์ฝ”๋ฃจํ‹ด์„ ๋จผ์ € ์ง€์›ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ๋„ ์ด๋Ÿฐ ๋ฐฐ๊ฒฝ์ด ์žˆ๋‹ค.

๋‹คํ–‰ํžˆ Python์€ (stackless๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„) yield ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. Python 3.4 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฐ์ข… ํŒŒ์ผ ์ž…์ถœ๋ ฅ, subprocess, socket ํ†ต์‹  ๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๋ชจ๋‘ ์ฝ”๋ฃจํ‹ดํ™” ํ•ด์ฃผ๋Š” asyncio ํŒจํ‚ค์ง€๊ฐ€ ๊ธฐ๋ณธ ํƒ‘์žฌ๋˜์—ˆ๋‹ค. Python 3.5 ๋ถ€ํ„ฐ๋Š” C#๋ฅผ ๋ณธ๋”ด async ํ•จ์ˆ˜ ์„ ์–ธ์ž์™€ await ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด asyncio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•  ์ˆ˜๋ฐ–์— ์—†๋˜ ์ฝ”๋ฃจํ‹ด ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๋€Œ๊ณ , ์ฝ”๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

4.1.1. ๋ฉ€ํ‹ฐ์ฝ”์–ด๋กœ ํ”„๋กœ๊ทธ๋žจ ๋Œ๋ฆฌ๊ธฐ[ํŽธ์ง‘]

์œ ๋‹‰์Šค, ๋ฆฌ๋ˆ…์Šค, macOS์˜ ํŒŒ์ด์ฌ์—์„œ ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์“ฐ๋ ค๋ฉด ์•„๋ž˜์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ ์œผ๋ฉด ๋œ๋‹ค.

import multiprocessing as mp

def work(job_list):
    return job_list + 1

p = mp.Pool(4)
p.map_async(work, job_list).get()


์œˆ๋„์šฐ์ฆˆ๋Š” ํฌํฌ(fork) ํ•จ์ˆ˜๊ฐ€ ์—†์–ด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

if __name__ == '__main__':
    mp.freeze_support()


[python] ํŒŒ์ด์ฌ์œผ๋กœ ์‹œ๋„ํ•ด๋ณด๋Š” ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ”„๋กœ์„ธ์‹ฑ, ์ž๊ณ  ์žˆ๋Š” ์ฝ”์–ด๋“ค์„ ๊นจ์šฐ๊ธฐ 2015. 11. 24.

4.2. ๋‚œ์žกํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฐ ํ•˜์œ„ ํ˜ธํ™˜ ์—๋Ÿฌ[ํŽธ์ง‘]

์ตœ์‹  ์–ธ์–ด์— ๋น„ํ•ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋ณต์žกํ•˜๋‹ค. ์ด๋Š” ์—ญ์‚ฌ๊ฐ€ ์˜ค๋ž˜๋œ ์–ธ์–ด์ด๋‹ค ๋ณด๋‹ˆ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์ด ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4.2.1. ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ[ํŽธ์ง‘]

์˜ค๋Š˜๋‚  ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋Š” ์ฃผ๋กœ pip์„ ์ด์šฉํ•œ๋‹ค.
pip install <ํŒจํ‚ค์ง€๋ช…>
์ด ๋ฐฉ์‹์€ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋œ ํŒŒ์ด์ฌ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

์šฐ์„  ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋™์‹œ์— ์ž‘์—…ํ•  ๋•Œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋ น ํ”„๋กœ์ ํŠธ A๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ X์˜ 1.1 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ B๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— X์˜ 1.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ X์˜ 1.1 ๋ฒ„์ „๊ณผ 1.0 ๋ฒ„์ „์„ ๋™์‹œ์— ์„ค์น˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ƒ ํ™˜๊ฒฝ์ด๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค์–ด ํ”„๋กœ์ ํŠธ A์™€ B์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€์ƒ ํ™˜๊ฒฝ์€ virtualenv๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, Python 3.3๋ถ€ํ„ฐ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ venv ๋ชจ๋“ˆ์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
# virtualenv๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
virtualenv my-venv
# venv๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
python -m venv my-venv
์œ„์˜ ๋ช…๋ น์€ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— my-venv๋ผ๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•œ๋‹ค.[18] ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ด๋ฆ„๋„ venv๋กœ ํ•œ๋‹ค.

๋˜ํ•œ pip์€ ํŒจํ‚ค์ง€ ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์„ ๊ผผ๊ผผํ•˜๊ฒŒ ๋”ฐ์ง€์ง€ ์•Š๋Š”๋‹ค. ๊ฐ€๋ น ์œ„์˜ ํ”„๋กœ์ ํŠธ A์™€ B๋ฅผ ๋‚จ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜์ž. ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ pip์„ ์‚ฌ์šฉํ•ด A๋ฅผ ์„ค์น˜ํ•˜๋ฉด A๊ฐ€ ํ•„์š”ํ•œ X์˜ 1.1 ๋ฒ„์ „์ด ์„ค์น˜๋œ๋‹ค. ์ดํ›„ B๋ฅผ ์„ค์น˜ํ•˜๋ฉด X์˜ 1.1 ๋ฒ„์ „์„ ์‚ญ์ œํ•˜๊ณ  1.0 ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— A๋ฅผ ์“ธ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.[19] npm๊ณผ ๊ฐ™์€ ํ˜„๋Œ€์ ์ธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋“ค์€ ํŒจํ‚ค์ง€ ํ˜ธํ™˜์„ฑ์„ ๊ผผ๊ผผํ•˜๊ฒŒ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” B๋ฅผ ์„ค์น˜ํ•˜๋ ค ํ•˜๋ฉด ๊ฑฐ๋ถ€ํ•˜์ง€๋งŒ, pip์€ ๊ทธ๋Ÿฐ ๊ฑฐ ์—†๋‹ค.

๋ฆฌ๋ˆ…์Šค์™€ ๊ฐ™์ด ์ž์ฒด์ ์œผ๋กœ ํŒŒ์ด์ฌ์„ ํƒ‘์žฌํ•œ ์šด์˜์ฒด์ œ์—์„œ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํŠนํžˆ ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค. ์‹œ์Šคํ…œ์— ๋‚ด์žฅ๋œ ํ•ต์‹ฌ ๋„๊ตฌ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋œ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋‹ค๊ฐ€ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ OS๋ฅผ ์žฌ์„ค์น˜ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ OS์—์„œ๋Š” ์‹œ์Šคํ…œ ๋‚ด์žฅ ํŒŒ์ด์ฌ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์•ˆ ๋˜๋ฉฐ, ๋Œ€์‹  #pip install --user๋กœ ์‚ฌ์šฉ์ž๋ณ„ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์— ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

ํ˜น์—ฌ๋‚˜ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ์ ‘ํ•ฉ ๋“ฑ์„ ์ด์œ ๋กœ ํŒŒ์ด์ฌ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์™ธ๋ถ€ ๋ชจ๋“ˆ(.msi, .exe, .pkg๋“ฑ์˜ ์„ค์น˜ํŒŒ์ผ)์„ ์ด์šฉํ•ด ์„œ๋ฒ„์— ๋‚ด์žฅํ•˜์—ฌ ๋Œ๋ฆฌ๋ ค๋Š” ๋•Œ์—๋Š” ์ •๋ง ์ง€์˜ฅ์„ ๋ง›๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ด์ฌ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”์–ด์™€ ์„œ๋ฒ„์— ์„ค์น˜๋˜๋Š” ๋ชจ๋“ˆ์ด ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”์–ด๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ. (--๋‹ค๋ฅธ ๊ฒƒ์ด ์ฝ”์–ด ๊ฒฝ๋กœ๋ฟ์ด๋ผ๋ฉด ๊ทธ๋‚˜๋งˆ ๋‚ซ์ง€๋งŒ ๋‚ด๋ถ€ ๋กœ์ง๋งˆ์ € ๋‹ค๋ฅด๋‹ค๋ฉด...?--์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์ƒ์ƒํ•˜๋ฉด ์ˆ˜๋ช…๋งŒ ์ค„์–ด๋“ค ๋ฟ์ด๋‹ค.) ์ด๋ฅผ ๊ณ ์น˜๋ ค๋ฉด ์—๋Ÿฌ์˜ ์ฝœ์Šคํƒ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„์ง€ ๋จธ๋ฆฌ๋ฅผ ์ฅ์–ด์งœ๊ณ  ๋ชจ๋“ˆ ๋‚ด์˜ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด ๊ณ ์น˜๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค.
์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ผ์ด๋‹ค. ๋‹ค๋งŒ ํŒŒ์ด์ฌ์˜ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€ ๋ฒ„์ „์˜ ํ†ต์ผ์„ฑ ๋ถ€์กฑ๊ณผ ๋งŒ๋‚˜๋ฒ„๋ฆฌ๋Š”๋ฐ, ๋ฒ„์ „์— ๋”ฐ๋ผ ์ฒœ์ฐจ๋งŒ๋ณ„๋กœ ๋‹ค๋ฅผ ์ด ๋Œ€์ฒ˜๋ฒ•๋“ค์ด ์ธํ„ฐ๋„ท ์˜จ๊ฐ– ๊ตฌ์„์„ ๋‹ค ๋’ค์ ธ๋„ ๋‚˜์˜ค์ง€ ์•Š์•„ ์•„์ŠคํŠธ๋ž„ํ•œ ๋‚œ์ด๋„๋ฅผ ์„ ์‚ฌํ•œ๋‹ค. (๋‚˜์˜ค๊ธด ํ•˜์ง€๋งŒ, ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋ฌผ๋ก  ์ง์ ‘ ์งˆ๋ฌธ์„ ์˜ฌ๋ ค๋„ ๋Œ€๋ถ€๋ถ„ ๋‹ต์€ ์•ˆ๋‚˜์˜จ๋‹ค.) ์ฐจ๋ผ๋ฆฌ ์ฒ˜์Œ ๋ฐœ๊ฒฌ๋˜๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ”์„œ ํ”ผํ•ด๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฏธ ์ง„ํ–‰๋ ๋Œ€๋กœ ์ง„ํ–‰๋œ ํ”„๋กœ์ ํŠธ์ธ ๊ฒฝ์šฐ ๊ทธ์ € ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธธ ๋นŒ ๋ฟ์ด๋‹ค.

4.2.2. ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

ํŒŒ์ด์ฌ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ์„ธ์›”์ด ํ๋ฆ„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋ฐ”๋€Œ์—ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ผ๋Š” ๊ฐœ๋…์ด ์—†์–ด์„œ ๊ฐ์ž ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด ์“ฐ๋˜ ์‹œ์ ˆ์—๋Š” setup.py๋ผ๋Š” ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ์ž ๋งŒ๋“ค์–ด์„œ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ๊ด€ํ–‰์ด์—ˆ๋‹ค.[20] ์ด๋ฅผ ์–ธ์–ด ์ฐจ์›์—์„œ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Python 1.6๋ถ€ํ„ฐ๋Š” distutils๋ผ๋Š” ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ๊ธฐ๋ณธ ํƒ‘์žฌํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ distutils๋Š” ์ž์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ[21], ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด setuptools๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ๋“ฑ์žฅํ•˜์˜€๋‹ค.

์„ธ์›”์ด ํ˜๋Ÿฌ pip์ด๋ผ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์™€ PyPI๋ผ๋Š” ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ, setup.py๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ์กด์˜ ๋ฐฉ์‹์˜ ๋‹จ์ ์ด ๋ถ€๊ฐ๋˜์—ˆ๋‹ค.
  • setup.py๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋„๊ตฌ[22]๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์—†๋‹ค.
  • setup.py๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด๋‚˜ ๋ฒ„์ „๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กญ๋‹ค.
  • setup.py์—๋Š” ์•„๋ฌด ํŒŒ์ด์ฌ ์ฝ”๋“œ๋‚˜ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•…์˜์ ์ธ ์ฝ”๋“œ๋ฅผ ์‹ฌ์„ ์ˆ˜ ์žˆ๋‹ค.
  • setup.py๋Š” setuptools๋ฅผ ์ง์ ‘ importํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†๋‹ค.

์ด ๋•Œ๋ฌธ์— setup.py๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  pyproject.toml[23]์ด๋ผ๋Š” ์„ค์ •ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€์•ˆ์ธ PEP-518์ด ๋“ฑ์žฅํ•˜์˜€๋‹ค. pip 10.0๋ถ€ํ„ฐ๋Š” pyproject.toml์„ ์ง€์›ํ•œ๋‹ค. ๋‹ค๋งŒ ์šด์˜์ฒด์ œ ์ค‘์—๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ pip์„ ํƒ‘์žฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— pip์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค. flit์ด๋‚˜ Poetry ๋“ฑ์˜ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด setup.py๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์˜ˆ์ „ ๋ฐฉ์‹๋Œ€๋กœ distutils/setuptools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ setup.py๊ณผ pyproject.toml๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Python ์œผ๋กœ ๊ฐœ๋ฐœํ•œ SW๋ฅผ ๊ณต๊ฐœ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜, ๋ณด์•ˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•œ๋‹ค.
  • PyํŒŒ์ผ์„ Bytecode๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•#
  • PyInstaller๋ฅผ ์‚ฌ์šฉํ•ด์„œ EXE ๋˜๋Š” ELF ํ˜•์‹์˜ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ์‚ฌ์šฉ๋ฒ•๊ณผ ์ฃผ์˜์‚ฌํ•ญ
๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ byte code์ธ pycํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ, ์ด ๋ฐฉ๋ฒ•์€ ์กฐ๊ธˆ๋งŒ ๋…ธ๋ ฅํ•˜๋ฉด ๋””์ปดํŒŒ์ผ์ด ์‰ฝ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์—†๊ณ  ๋‹ค๋งŒ ์ฝ”๋“œ ๋ณด๊ธฐ๋ฅผ ์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. Pyc ํŒŒ์ผ๋ณด๋‹ค ๋‚˜์€ ๋ฐฉ๋ฒ•์€ PyInstaller๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. PyInstaller๋Š” PyํŒŒ์ผ์„ ์ข…์†์„ฑ์„ ๋ถ„์„ํ•ด์„œ ํ•„์š”ํ•œ shared lib๋ฅผ ํ•˜๋‚˜์— ํด๋”์— ํŒจํ‚ค์ง•ํ•˜๊ณ , EXE๋‚˜ ELF์˜ ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค. PyInstaller๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ณผ์ •์—์„œ --key ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด AES256 ์œผ๋กœ Bytecode๋ฅผ ์•”ํ˜ธํ™”ํ•œ๋‹ค.

5. ๋‹ค์–‘ํ•œ python ๊ตฌํ˜„์ฒด ์ข…๋ฅ˜[ํŽธ์ง‘]

๋ณดํ†ต ๋งํ•˜๋Š” Python์€ C๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด์™€ ๊ตฌ๋ถ„ํ•˜์—ฌ ์–ธ๊ธ‰ํ•  ๋•Œ๋Š” CPython์ด๋ผ๊ณ  ํ‘œ๊ธฐํ•œ๋‹ค. #1 ๋˜๋Š” #2์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—ด๋žŒํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Stackless Python์€ CPython์—์„œ C ์Šคํƒ์„ ์—†์•ค ๊ฒƒ์ด๋‹ค.

Cython์€ ํŒŒ์ด์ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ C ์–ธ์–ด ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ปดํŒŒ์ผํ•œ๋‹ค.

Pyston์€ C++๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

ํŒŒ์ด์ฌ ์ž์ฒด๋กœ ๊ตฌํ˜„๋œ PyPy๋„ ์žˆ๋‹ค. Pyston๊ณผ PyPy๋Š” JIT๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

Java๋กœ ๊ตฌํ˜„๋˜์–ด Java Virtual Machine ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” Jython๊ณผ C#์œผ๋กœ ๊ตฌํ˜„๋œ .NET Framework ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” IronPython์ด ์žˆ๋‹ค.

Jython๊ณผ IronPython์€ ๊ฐ€์ƒ๋จธ์‹ ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ตฌํ˜„์ฒด์ด๋‹ค. ์‹œ์ž‘๋ถ€ํ„ฐ JVM ๋˜๋Š” .NET CLR ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” Python ๊ตฌํ˜„์ฒด๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ๋“œ๋ฌผ๋‹ค. ๊ธฐ์กด์— Java๋‚˜ .NET Framework์—์„œ ๊ฐœ๋ฐœ๋˜์–ด ์šด์˜๋˜๋˜ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์‹œ์Šคํ…œ์ด ์กด์žฌํ•˜๊ณ , ์ด ํ™˜๊ฒฝ ํ•˜์—์„œ Python์˜ ๊ฐ„๊ฒฐํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ๊ณผ ๋†’์€ ์ƒ์‚ฐ์„ฑ์„ ๋„์ž…ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

Jython๊ณผ IronPython์€ ๋‘˜ ๋‹ค CPython์— ๋น„ํ•˜๋ฉด ์‹คํ–‰ ์†๋„๊ฐ€ ๋งค์šฐ ๋А๋ฆฌ๋ฉฐ, Jython์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์‹ฌ๊ฐํ•  ์ •๋„๋กœ ๋งŽ์ด ๋А๋ฆฌ๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ, ๋ณด์กฐ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…๋“ค์„ ๋งค์šฐ ์†์‰ฝ๊ฒŒ Python ์Šคํฌ๋ฆฝํŠธ๋กœ Java, .NET Framework์˜ ์ž์›์„ ๊ทธ๋Œ€๋กœ ๋Œ์–ด๋‹ค ์จ์„œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ๊ณต์ˆ˜์™€ ํŽธ๋ฆฌํ•จ์—์„œ ํฐ ์žฅ์ ์ด ์žˆ๋‹ค.

JavaScript๋กœ ๊ตฌํ˜„ํ•œ Brython๊ณผ Skulpt๋„ ์žˆ๋‹ค. Pythonpad์—์„œ Brython ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•œํŽธ ์ค‘๊ตญ์—์„œ๋Š” Chinese Python์ด๋ผ๋Š”, ์ค‘๊ตญ์–ด ๋ฌธ๋ฒ•์œผ๋กœ ํ•œ์ž๋ฅผ ์ณ์„œ ๋Œ์•„๊ฐ€๋Š” ์–ธ์–ด๋ฅผ ๋…์ž ๊ฐœ๋ฐœํ–ˆ๋‹ค.

5.1. Stackless Python[ํŽธ์ง‘]

ํ™ˆํŽ˜์ด์ง€

ํŒŒ์ด์ฌ์˜ ํ‘œ์ค€ ๊ตฌํ˜„์ธ CPython์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ C๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š”๋ฐ, ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ(Call stack)์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ทธ๋งŒ C์˜ ํ˜ธ์ถœ ์Šคํƒ[24]์— ๊ทธ๋Œ€๋กœ ์–น์–ด๊ฐ€๋„๋ก ๊ตฌํ˜„๋˜๊ณ  ๋ง์•˜๋‹ค. ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์“ธ ์ˆ˜ ์žˆ๋А๋ƒ์— ๊ด€๊ณ„์—†์ด C ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฝ‰ ์ฑ„์šฐ๋Š” ์ˆœ๊ฐ„ ๊ทธ๋Œ€๋กœ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์—๋Ÿฌ๊ฐ€ ๋œจ๊ฒŒ ๋˜์–ด๋ฒ„๋ ธ๊ณ [25], ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ํ˜ธ์ถœ ์Šคํƒ, ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์„ CPython ์Šค์Šค๋กœ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋˜์–ด ์ฝ”๋ฃจํ‹ด ๋“ฑ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์“ธ ์ˆ˜ ์—†๊ฒŒ ๋˜๊ณ  ๋ง์•˜๋‹ค.

Christian Tismer๋ผ๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํƒ€ํŒŒํ•˜๋ ค๋ฉด "CPython ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์„œ[26] C ์Šคํƒ์„ ์“ฐ๋Š” ๋ถ€๋ถ„์„ ์ „๋ถ€ ๋“ค์–ด๋‚ด๊ณ  ์ƒˆ๋กœ ํ˜ธ์ถœ ์Šคํƒ์„ ์งค ์ˆ˜๋ฐ–์— ์—†๋‹ค"๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๊ทธ๊ฒƒ์„ ์‹ค์ œ๋กœ ์‹คํ–‰์— ์˜ฎ๊ธด ๊ฒƒ์ด Stackless Python์ด๋‹ค. ์ด๋ฆ„์˜ Stackless๋Š” ๊ทธ๋ž˜์„œ ์‚ฌ์‹ค C ํ˜ธ์ถœ ์Šคํƒ์ด ์—†๋‹ค๋Š” ์˜๋ฏธ. Stackless Python์€ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์—๋Ÿฌ๊ฐ€ ๋œ ๋‚œ๋‹ค๋Š” ์‚ฌ์†Œํ•œ ์žฅ์ [27] ์™ธ์—๋„, ์Šค์Šค๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด์ ์ธ ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ดํฌ๋กœ์“ฐ๋ ˆ๋“œ[28]๋‚˜ ์ฝ”๋ฃจํ‹ด ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋๊ณ , ๋•๋ถ„์— ์“ฐ๋ ˆ๋“œ๋„ ๊ณ ์ž๊ณ  ์ฝ”๋ฃจํ‹ด๋„ ์•ˆ๋˜๋Š” CPython์— ๋น„ํ•ด ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ์—์„œ ํ›จ์”ฌ ๊ฐ•๋ ฅํ•œ ์ด๋“์„ ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค. CPython๋„ 3.4 ๋ฒ„์ „ ์ดํ›„๋กœ ์ฝ”๋ฃจํ‹ด์„ ์ง€์›ํ•œ๋‹ค. ์•„๋ž˜ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ ์„น์…˜ ์ฐธ์กฐ.

๋‹ค๋งŒ, ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด CPython์„ ๊ฐœ์กฐํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ์ด์ฌ์˜ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค ๊ฐœ์กฐํ•œ ์ฝ”๋“œ๊ฐ€ ์ด์ƒ์—†์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ•ญ์ƒ ํ™•์ธํ•ด์•ผ ํ•˜๊ณ , ์ด ๊ธฐ๋Šฅ์ด ์šด์˜์ฒด์ œ๋‚˜ ํ•˜๋“œ์›จ์–ด์—๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊นŒ๋‹ญ์— ์‹ฌํ•˜๋ฉด ๊ฐ๊ฐ์˜ ์šด์˜์ฒด์ œ๋‚˜ CPU๋ณ„๋กœ ๊ฐœ๋ฐœ์„ ๋”ฐ๋กœ ํ•ด์•ผ ํ•˜๋Š” ํ”ผ๊ณคํ•œ ์ž‘์—…์„ Python์ด ๋งํ•  ๋•Œ๊นŒ์ง€ ํ•ด์•ผ ํ•˜๋Š” ์ง€๊ฒจ์šด ๊ธธ์„ ๊ฑท๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ํ•œ๋™์•ˆ Stackless Python์˜ ๊ฐœ๋ฐœ์ด ์ž ์‹œ ์ค‘๋‹จ๋œ ์ผ๋„ ์žˆ์—ˆ์„ ์ •๋„.

๊ทธ๋Ÿฐ ์™€์ค‘์— PyPy ๋ฆฌ๋“œ ๊ฐœ๋ฐœ์ž Armin Rigo๊ฐ€ "C ํ˜ธ์ถœ ์Šคํƒ๋„ ์–ด์ฐจํ”ผ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์ž–์•„? ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๊ฑธ 'memcpy()'๋กœ ํ†ต์งธ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ๋ฎ์–ด ์”Œ์šฐ๋ฉด ํ˜ธ์ถœ ์Šคํƒ์„ ์ €์žฅํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ๊ฑฐ ์•„๋ƒ?"๋ผ๋Š” ์‹ค๋กœ ๋งˆ๊ฐœ์กฐ์Šค๋Ÿฌ์šด ์•„์ด๋””์–ด๋ฅผ ๋‚ด๋†“๋Š”๋ฐ, Christian Tismer๊ฐ€ ์—ฌ๊ธฐ์— ๋งค์šฐ ๊นŠ์€ ๊ฐ๋ช…์„ ๋ฐ›๊ณ  Armin Rigo์™€ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•œ ๊ฒฐ๊ณผ greenlet์ด๋ผ๊ณ  ํ•˜๋Š” import๋งŒ ํ•˜๋ฉด ์ฝ”๋ฃจํ‹ด์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ์— ์ด๋ฅธ๋‹ค. ๊ฐ™์€ ๊ฑธ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์–ธ์–ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ž์ฒด๋ฅผ ๋œฏ์–ด ๊ณ ์น˜๋Š” ์ˆ˜๊ณ ์— ๋น„ํ•˜๋ฉด ๋†€๋ž„ ๋งŒํผ์˜ ๋…ธ๋ ฅ ์ ˆ์•ฝ์ด ์•„๋‹ ์ˆ˜ ์—†๋‹ค. ๋‹ค๋งŒ ์ด ์ง“์„ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ Stackless Python์— ๋น„ํ•˜๋ฉด ์•„๋ฌด๋ž˜๋„ ์„ฑ๋Šฅ์ด ๋”ธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์ ˆ์‹คํ•˜๊ฒŒ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ EVE ์˜จ๋ผ์ธ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—” Stackless Python์„ ์“ด๋‹ค.

ํ•˜์ง€๋งŒ... Armin Rigo์™€ Christian Tismer๋Š” ์ง€๊ธˆ ๋‘˜ ๋‹ค PyPy๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๊ณ , PyPy๋Š” ์ž์ฒด ์Šคํƒ์„ ์“ธ ์ˆ˜ ์žˆ๋Š” Stackless ๋ชจ๋“œ์˜ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

5.2. C ์–ธ์–ด ํ™•์žฅ, Cython[ํŽธ์ง‘]

์‹ธ์ด์ฌ Psyson
Python์˜ ์†๋„๋ฅผ ๋†’์ด๊ณ ์ž ์•„์˜ˆ C์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ•œ ํŒจํ‚ค์ง€. ํŒŒ์ด์ฌ์˜ ๋ฌธ๋ฒ•์„ ํ™•์žฅํ•˜์—ฌ ์ •์  ํƒ€์ž… ์„ ์–ธ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด, ๊ธฐ์กด์˜ C ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ ‘์ฐฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. Python C API๋ฅผ ์ด์šฉํ•˜์—ฌ C ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ ‘์ฐฉํ•˜๋Š” ๊ธฐ์กด์˜ ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , C์–ธ์–ด๋กœ ๋ณ€ํ™˜๋˜์–ด ์ปดํŒŒ์ผ ๋œ๋‹ค๋Š” ์  ๋•Œ๋ฌธ์— ctypes๋กœ ๋ง์”Œ์šฐ๋Š” ๊ฒƒ ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ(*.so, *.dll)๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ ๊ฒŒ๋Š” ์—ด ๋ฐฐ ์ •๋„์—์„œ ๋งŽ๊ฒŒ๋Š” ์ฒœ ๋ฐฐ ์ด์ƒ๊นŒ์ง€ ์†๋„ ํ–ฅ์ƒ์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก , ํŒŒ์ด์ฌ๊ณผ C์˜ ๊ตฌํ˜„ ์ฐจ์ด๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ปดํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ์ˆ˜์ •์ด ์š”๊ตฌ๋œ๋‹ค. ๊ทธ๋ƒฅ ๋ƒ…๋‹ค ๋„ฃ๊ณ  ๋Œ๋ ค๋ฒ„๋ฆฌ๋ฉด ์ œ๊ธฐ๋Šฅ์„ ์ œ๋Œ€๋กœ ๋ฐœํœ˜ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด๋Š” ๊ฑฐ์˜ ๋ฐœ์ „์ด ์—†๋Š” ๊ฒฝ์šฐ๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง์€ ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ๊ธฐ๋ณธ์ด๋‹ค.)

C๋ฅผ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ Cython์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„์˜ˆ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, C์™€ Python ๋‘˜ ๋ชจ๋‘์— ์ต์ˆ™ํ•  ๋•Œ Cython์„ ๊ฐ€์žฅ ํšจ๊ณผ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๊ณ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋ฉด ์ผ๋‹จ ์ฝ”๋“œ ์ˆ˜์ •์ด ๋ถˆํ•„์š”ํ•œ PyPy๋ฅผ ์‹œ๋„ํ•˜๊ณ , ๊ทธ๊ฑธ๋กœ๋Š” ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์„ ๋•Œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•ด ๋ณด๊ณ , ๊ทธ๊ฑธ๋กœ๋„ ๋ถ€์กฑํ•  ๋•Œ ๊ณ ๋ คํ•ด๋ณด์ž. Cython์˜ ๋Œ€์•ˆ์œผ๋กœ๋Š”, SWIG, CFFI(C Foreign Function Interface), pybind(C++ ์ „์šฉ) ๋“ฑ์˜ ๋„๊ตฌ๋“ค์ด ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ, PyPy๋„ Cython์— ํฌ๊ฒŒ ๋ฐ€๋ฆฌ์ง€ ์•Š์„ ์ •๋„๋กœ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , PyPy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์†๋„ ํ–ฅ์ƒ์ด ๋ณ„๋กœ ์—†๋‹ค๋ฉด Cython์„ ์‚ฌ์šฉํ•˜์—ฌ C๋กœ ๋ณ€ํ™˜ํ•ด๋„ ์ƒํ™ฉ์ด ๋น„์Šทํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. Cython์„ ์‚ฌ์šฉํ•˜์—ฌ ์†๋„ ํ–ฅ์ƒ ํšจ๊ณผ๋ฅผ ์–ป๊ณ ์ž ํ•œ๋‹ค๋ฉด, ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” PyPy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†๋„๋ฅผ ๋ฏธ๋ฆฌ ์ฒดํฌํ•ด๋ณด๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

5.3. C++ ๊ตฌํ˜„, Pyston (ํ”„๋กœ์ ํŠธ ์ค‘๋‹จ)[ํŽธ์ง‘]

Pyston์€ LLVM ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Pyston์€ JIT(just-in-time) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‚ด์žฅํ•˜์—ฌ ๋ฐ˜๋ณต๋˜๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

2014๋…„ 4์›” ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ, Python 2.7 ํ˜ธํ™˜, x86 64๋น„ํŠธ ํ”Œ๋žซํผ์„ ๋ชฉํ‘œ๋กœ ๊ฐœ๋ฐœ ์ค‘์— ์žˆ๋‹ค. Dropbox Tech Blog - Introducing Pyston: an upcoming, JIT-based Python implementation (April 3, 2014)

Pyston์€ C++๋กœ ์ž‘์„ฑ๋˜์–ด์กŒ๋‹ค. Technical overview ยท dropbox/pyston Wiki ยท GitHub (1 Sep 2016)

์šฐ๋ถ„ํˆฌ์—์„œ๋งŒ ํ…Œ์ŠคํŠธ๋˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ 2017๋…„ 1์›” 31์ผ๋ถ€๋กœ Dropbox์—์„œ ๊ณต์‹์ ์œผ๋กœ ์Šคํฐ์‹ฑ์„ ์ข…๋ฃŒํ–ˆ๋‹ค. Pyston 0.6.1 released, and future plans (January 31, 2017) ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ Dropbox ์ง์›์ธ๋ฐ ๋” ์ด์ƒ ์ฐธ์—ฌ๋ฅผ ๋ชปํ•˜๋Š” ์‚ฌ์‹ค์ƒ ํ”„๋กœ์ ํŠธ ์ค‘๋‹จ์ด๋‹ค. ์งํ›„ ํ”„๋กœ์ ํŠธ ๋ฆฌ๋”์˜€๋˜ Kevin Modzelewski๋Š” ํ‡ด์‚ฌํ•˜์˜€๋‹ค.

์„ฑ๋Šฅ์€ ์ƒ๋‹นํžˆ ํ›Œ๋ฅญํ•œ ํŽธ์ด์—ˆ์œผ๋‚˜, CPython๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์˜ค๋žซ๋™์•ˆ ๋งž์ถ”์ง€ ๋ชปํ–ˆ๊ณ , ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘๋์„ ๋•Œ์™€ ๋‹ค๋ฅด๊ฒŒ Dropbox์˜ ์ฝ”๋“œ๊ฐ€ Go๋ž‘ Python3๋กœ ๋งŽ์ด ์ด์ „๋œ ๊ฒƒ์ด ์›์ธ์œผ๋กœ ๋ณด์ธ๋‹ค(์ฆ‰, ๊ตณ์ด ํˆฌ์žํ•˜๋ฉด์„œ ๊ฐœ๋ฐœ์„ ์ง€์†ํ•  ์ด์œ ๊ฐ€ ์—†๋Š” ์ƒํ™ฉ). ๋˜ํ•œ ๊ณง Python2 ๋ฒ„์ „์ด ๊ณต์‹์ ์œผ๋กœ ์ง€์›์ด ์ค‘๋‹จ๋  ์˜ˆ์ •์ด๋ผ์„œ ์™„์ „ํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๊ฒŒ ๋˜๋Š” ์‹œ์ (์ด์กฐ์ฐจ ์•„๋ฌด๋„ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค)์—์„œ ์ด ํ”„๋กœ์ ํŠธ์˜ ์˜๋ฏธ๊ฐ€ ๋งŽ์ด ํ‡ด์ƒ‰๋  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋˜ ๊ฒƒ.

Dropbox๋Š” Pyston์—์„œ PyPy๋กœ ์˜ฎ๊ฒผ๋‹ค๊ฐ€ ํ˜„์žฌ๋Š” Go๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค. Dropbox Tech Blog: Open Sourcing Our Go Libraries (July 1, 2014)

ํ™ˆํŽ˜์ด์ง€

5.4. Python ๊ตฌํ˜„, PyPy[ํŽธ์ง‘]

Python์œผ๋กœ Python์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ์ ํŠธ. JIT ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

5.5. Java ๊ตฌํ˜„, Jython[ํŽธ์ง‘]

Jython์€ Java๋กœ ๊ตฌํ˜„๋˜์–ด JVM ์œ„์—์„œ ์‹คํ–‰๋œ๋‹ค. # CPython์ด C์–ธ์–ด์™€ ๊ฒฐํ•ฉ์„ฑ, ์ ‘์ฐฉ์„ฑ์ด ์ข‹์€ ๊ฒƒ์ฒ˜๋Ÿผ Jython์€ Java์™€ ๊ฒฐํ•ฉ์„ฑ์ด ๋Œ€๋‹จํžˆ ์ข‹์œผ๋ฉฐ, ์‹ค์ œ๋กœ Java ์ง„์˜์˜ ๋ฉ”์ด์ € ์—…์ฒด์ธ Oracle, IBM ๋“ฑ์—์„œ๋„ ์ž์‚ฌ ์ œํ’ˆ์— Jython์„ ๋‚ด์žฅํ•˜์—ฌ ์Šคํฌ๋ฆฝํŒ… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์„ ์ •๋„๋‹ค.

Jython์€ JVM ์œ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ, Python Module์ด ์ œ๊ณตํ•˜๋Š” API๋Š” ๋ฌผ๋ก ์ด๊ณ , JDK๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  API๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜คํžˆ๋ ค pycrpyto์™€ ๊ฐ™์ด C์–ธ์–ด๋กœ ๊ตฌํ˜„๋œ CPython ๋ชจ๋“ˆ์€ Jython์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ Java Class๋ผ๋ฉด, ์„ค๋ น JNI๋กœ ๋˜์–ด์žˆ์–ด์„œ C๋กœ ์ž‘์„ฑ๋œ ๋™์  ๋ชจ๋“ˆ(*.dll, *.so ๋“ฑ)์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ Jython์—์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ์ œ์•ฝ์ด ์—†๋‹ค. ๋˜ํ•œ JVM ์œ„์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์  ๋•Œ๋ฌธ์— CPython์˜ GIL์ด ์ด์‹ ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, CPython์ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์—์„œ ๋ณด์ด๋Š” ๋‹จ์ ์ด Jython์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. threading, threadsafety ๋“ฑ์˜ Python์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ(๋ฝ, ๋™๊ธฐํ™” ๊ด€๋ จ) ๊ธฐ๋Šฅ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด java.util.concurrent์—์„œ ์ œ๊ณตํ•˜๋Š” Java API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

5.6. .NET Framework ๊ตฌํ˜„, IronPython[ํŽธ์ง‘]

Microsoft .NET Framework์˜ ๊ฐ€์ƒ๋จธ์‹ ์ธ CLR ์ƒ์—์„œ ๊ตฌํ˜„๋˜๊ณ  ์ด ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” Python์ด๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์ด๋“ค ๋™์ ์–ธ์–ด๋ฅผ CLR ์œ„์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ DLR์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์ด๋‹ค. ์ œ์ž‘์ž Jim Hugunin#์€ Jython์˜ ์ œ์ž‘์ž์ด๋ฉฐ, NumPy์˜ ์ „์‹ ์ธ Numeric ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ œ์ž‘์ž์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋‹น์—ฐํžˆ .NET Framework ํ™˜๊ฒฝ์—์„œ ์ œ์ž‘๋œ DLL๊ณผ ๊ฒฐํ•ฉ์„ฑ์ด ๋งค์šฐ ์ข‹๋‹ค. Jython๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์—์„œ GIL ๋•Œ๋ฌธ์— ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์ž๋งคํ’ˆ์œผ๋กœ๋Š” C#๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ์„ ๋งˆ์น˜ ํŒŒ์ด์ฌ ๋ชจ๋“ˆ์ฒ˜๋Ÿผ ์ž„ํฌํŠธํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” Python for .NET์ด ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ์—๋Š” CPython ์œ„์—์„œ ๋Œ์•„๊ฐ„๋‹ค.

5.7. JavaScript ๊ตฌํ˜„, Brython[ํŽธ์ง‘]

JavaScript๋กœ ๊ตฌํ˜„๋˜์—ˆ๊ณ , JavaScript๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํฌ๋ฆฝํŠธ ํ˜•ํƒœ๋กœ Python์„ ์‹คํ–‰ํ•  ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” 'Brython'์ด ์žˆ๋‹ค. Python3๋ฅผ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด script ํƒœ๊ทธ์˜ type์„ text/python์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

<!DOCTYPE html>
<html>
<head>
  <title>Brython</title>
  <script src="brython.js"></script>
</head>
<body onload="brython()">
  <input id="zone"><button id="mybutton">click!</button>

  <script type="text/python">
    from browser import document, alert

    def echo(ev):
        alert(document['zone'].value)

    document['mybutton'].bind('click', echo)
  </script>
</body>
</html>

5.7.1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ transcrypt[ํŽธ์ง‘]

ํ™ˆํŽ˜์ด์ง€

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผํ•ด์„œ ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. (Ex. ํŒŒ์ด์ฌ + jQuery)

5.8. Micro Python[ํŽธ์ง‘]

ํ™ˆํŽ˜์ด์ง€
๊ณตํ™ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น์—๋ฎฌ๋ ˆ์ดํ„ฐ

ํŒŒ์ด์ฌ3์˜ ๊ธฐ๋Šฅ์„ ์ž„๋ฒ ๋””๋“œ ๋ณด๋“œ์— ์ตœ์ ํ™” ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. Windows OS์™€ Windows Embeded OS์™€์˜ ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ๊ตญ๋‚ด์—์„œ๋Š” ์ฃผ๋กœ ๋งˆ์ดํฌ๋กœ๋น„ํŠธ๋ณด๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ์นด์‹œ์˜ค FX-9860 GIII์— ํƒ‘์ œ๋˜์–ด ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

6. ์ƒํƒœ๊ณ„[ํŽธ์ง‘]

6.1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ[ํŽธ์ง‘]

  • ์ฝ˜์†”
    ์œˆ๋„์šฐ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ ๋ฆฌ๋ˆ…์Šค Bash ๊ฐ™์€ ๊ณณ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ฝ˜์†”ํ˜• ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•œ ์ฝ”๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝ˜์†” ์ƒ์—์„œ๋„ pretty printer๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ASCII Art๋กœ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ์ด์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • IDLE
      ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ํƒ‘์žฌ ์ฝ˜์†”๋กœ, ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ์ฝ˜์†”๊ณผ ๊ฐ™์ด ์ง์ ‘ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฌธ๋ฒ• ๊ฐ•์กฐ์™€ ๋””๋ฒ„๊น… ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ํŒŒ์ด์ฌ์— ์ž…๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋”ฐ๋กœ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋ฅผ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด IDLE๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.
    • IPython
      ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํŒŒ์ด์ฌ IDLE์™€ ๋‹ฌ๋ฆฌ LaTeX๋‚˜ svg, Matplotlib์˜ ํ”Œ๋กฏ ๊ฐ™์€ ๊ฒƒ๋“ค๋„ ์ถœ๋ ฅํ•ด์ค€๋‹ค. _repr_์ด๋ผ๋Š” ํŠน์ˆ˜ prefix๊ฐ€ ๋ถ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ํด๋ž˜์Šค์— ์ •์˜ํ•ด ๋†“์œผ๋ฉด IPython์˜ ์ถœ๋ ฅ ๊ธฐ๋Šฅ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํ›„์ˆ ํ•  Jupyter์˜ ๋ฐฑ์—”๋“œ๋กœ๋„ ์“ฐ์ธ๋‹ค.

6.1.1. ํ…์ŠคํŠธ ์—๋””ํ„ฐ[ํŽธ์ง‘]

๋ฌธ๋ฒ• ๊ฐ•์กฐ์™€ ์ž๋™ ๋“ค์—ฌ์“ฐ๊ธฐ ๋“ฑ์˜ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ. ๋ฉ”๋ชจ์žฅ๋ณด๋‹ค๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ๊ณ  IDE๋ณด๋‹ค๋Š” ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•œ, ์ค‘๊ฐ„ ์ •๋„์˜ ์—๋””ํ„ฐ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

IDE๋ณด๋‹ค ๊ธฐ๋Šฅ์€ ๋ถ€์กฑํ•œ ๋Œ€์‹  ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์ž์ž˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ ์ทจํ–ฅ์ด๋‚˜ ํ”„๋กœ์ ํŠธ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ด์ชฝ์„ ๋” ์„ ํ˜ธํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ํŒŒ์ด์ฌ ๋ฌธ๋ฒ•์€ C๋‚˜ Java์ฒ˜๋Ÿผ Boilerplating์ด ๋ณ„๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์— IDE์˜ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋œ ์ค‘์š”ํ•˜๋‹ค. ๊ฐœ์ค‘์—๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์—ฌ IDE ๋ชป์ง€์•Š์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
  • Visual Studio Code: Python ์ „์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋ฉด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

6.1.2. ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(IDE)[ํŽธ์ง‘]

  • PyCharm
    JetBrains ์‚ฌ์—์„œ ๊ฐœ๋ฐœํ•œ IDE๋กœ, ์ฝ”๋“œ ์ปดํ”Œ๋ฆฌ์…˜ ๊ธฐ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๊ณ  ๊ฐ์ข… ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›์ด ๊ฐ€์žฅ ๋›ฐ์–ด๋‚˜๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜์€ ๋ฌด๋ฃŒ์ด์ง€๋งŒ Django ๊ฐ™์€ ์›น ๊ฐœ๋ฐœ์— ๋„์›€์ด ๋˜๋Š” ํˆด์„ ์“ฐ๋ ค๋ฉด ํ”„๋กœํŽ˜์…”๋„ ์—๋””์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœํŽ˜์…”๋„ ์—๋””์…˜์ด ์—†๋”๋ผ๋„ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ html/javascript ๋ฌธ๋ฒ•์ง€์›๊ณผ ๊ธฐ๋ณธ์ ์ธ ์ž๋™์™„์„ฑ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Django ์ „์šฉ ์ž๋™์™„์„ฑ(์˜ˆ๋ฅผ ๋“ค์–ด ํ…œํ”Œ๋ฆฟ์—์„œ ํŒŒ์ด์ฌ ๋ณ€์ˆ˜๋ช…์„ ์ž๋™์™„์„ฑํ•ด ์ค€๋‹ค๋˜์ง€), ์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • Spyder
    ์˜คํ”ˆ ์†Œ์Šค IDE๋กœ PyCharm ํ”„๋กœํŽ˜์…”๋„ ์—๋””์…˜ ๊ฐ™์€ ํˆด์„ ์“ฐ๊ธฐ ํž˜๋“  ํ•™์ƒ[29]์ด๋‚˜ ๊ฐœ์ธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•  ๋งŒํ•œ ๋Œ€์•ˆ์ด๋‹ค.
  • Visual Studio
    ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ๊ฐœ๋ฐœ ํˆด์ด์ง€๋งŒ Breakpoint๋ฅผ ์„ค์ •ํ•ด ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, Variable Explorer์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜, Profiler๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋“ฑ ๊ธฐ๋Šฅ์ด ๋‹ค์–‘ํ•ด์„œ ์ถฉ๋ถ„ํ•œ ๊ฐ’์–ด์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ ์™ธ์—๋„ ํŒŒ์ด์ฌ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ž…๋ฌธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ์„ค์น˜๊ฐ€ ์‰ฝ๋‹ค๋Š” ์ ์—์„œ ์ถ”์ฒœํ•˜๋Š” ํŽธ์ด๋‹ค.

6.1.3. Notebook[ํŽธ์ง‘]

๋‹ค์†Œ ํŠน์ดํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ, ์Šคํƒ€์ผ ์žˆ๋Š” ๋ฌธ์„œ ์–‘์‹์— ์ฝ”๋”ฉ์„ ์ ‘๋ชฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ธ”๋กœ๊ทธ๋‚˜ ๋…ธํŠธ๋ฅผ ์“ฐ๋“ฏ์ด ๋‹จ๋ฝ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— Cell์„ ๋งŒ๋“ค์–ด์„œ ์ฝ”๋“œ๋ฅผ ์ ์–ด๋†“๊ณ , ์‹คํ–‰์‹œํ‚ค๋ฉด Plot ๊ฐ™์€ ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  ์ด๋Ÿฐ ๊ฒƒ์ด ๋ฌด์Šจ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ๊ฐ€ ์‹ถ๊ธด ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค๋‚˜ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ๊ฐ™์€ ๋ถ„์•ผ๋Š” ์™„์„ฑ๋œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค, ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋˜๋Š”์ง€ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋ฆฌํฌํŠธ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์„ ํ•˜๋Š” ์ผ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰ ์ด๋“ค์—๊ฒŒ๋Š” ํ•˜๋‚˜์˜ ์™„์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ๋Œ๋ ค๋ณด๋ฉฐ ์ฝ”๋”ฉ โ†’ ๊ฒฐ๊ณผ ํ™•์ธ โ†’ ์ฝ”๋“œ ์ˆ˜์ • โ†’ ๊ฒฐ๊ณผ ํ™•์ธ ๋“ฑ์˜ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”์™€ ๊ฐ™์€ ๋ถ„์•ผ์—์„œ๋„ ์ฝ”๋“œ๋ฅผ ์…€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ˜๋ณต ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ๋งค์šฐ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. SymPy, NumPy, SciPy, Matplotlib ๊ฐ™์€ ์ˆ˜ํ•™, ๊ณผํ•™, ๋จธ์‹  ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž์ฃผ ์ด์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ์œ ์šฉํ•œ ํŽธ์ด๋ฉฐ, pandas ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ•˜๋Š” ๋ฐ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์‹ค์ƒ ๋ฐ์ดํ„ฐ ๋ถ„์•ผ์—์„œ Notebook์€ ์—…๊ณ„ ํ‘œ์ค€๊ณผ ๊ฐ™์€ ์ทจ๊ธ‰์ด๋ฉฐ, ์ด ๋•Œ๋ฌธ์— Google์˜ Colaboratory๋‚˜ MS์˜ Azure Notebook๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ™˜๊ฒฝ ์—ญ์‹œ jupyter notebook์„ ๋ชจ๋ฐฉํ•˜๊ฑฐ๋‚˜ ํƒ‘์žฌํ•˜๊ณ  ์žˆ๋‹ค.
๊ณต๋ถ€ํ•˜๋Š” ์ž…์žฅ์—์„œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ผ์ผ์ด ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ํ†ต์ƒ์ ์ธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋А๊ปด์ง„๋‹ค๋ฉด ์ฐจ๋ผ๋ฆฌ Notebook์„ ์ด์šฉํ•ด ๊ฐ์ข… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ์Šตํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋‹ค๋งŒ ํŒŒ์ผ์ด ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ๊ฑฐ์ง„ ์›Œ๋“œ ๋ฌธ์„œ ๊ฐ™์€ ์ˆ˜์ค€์ด ๋˜์–ด ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— (Plot ๊ฐ™์€ ๊ฒƒ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค) ์šฉ๋Ÿ‰์ด ์ปค์ง€๊ณ  Git๊ณผ ๊ถํ•ฉ์ด ๋งž์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋Š” ์ ์€ ๋‹จ์ ์ด๋‹ค. ๋˜ํ•œ ์ตœ์†Œ ์ฒœ ์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๋…ธํŠธ๋ถ์œผ๋กœ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋…ธํŠธ๋ถ์€ ํ”„๋กœํ† ํƒ€์ดํ•‘์ด๋‚˜ ๋ฆฌํฌํŠธ๋ฅผ ์“ฐ๋Š”๋ฐ์—๋‚˜ ํ™œ์šฉํ•˜๊ณ  ์ง„์งœ ๊ฐœ๋ฐœ์€ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด ํ•˜๋„๋ก ํ•˜์ž.

6.1.4. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ[ํŽธ์ง‘]

๊ฐ์ข… ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. ๋ช‡๋ช‡ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฆฌ๋ˆ…์Šค์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ๋„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์— ํŠนํ™”๋œ Pip์ด๋‚˜ Conda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ดํ›„ ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค. ์“ธ๋ฐ์—†๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๊ฑฐ๋‚˜ ํŒจํ‚ค์ง€ ์˜์กด ๊ด€๊ณ„๊ฐ€ ๊ผฌ์ด๋Š” ๊ฒƒ์„ ๋ง‰์œผ๋ ค๋ฉด ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋งŒ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.[34]
  • Pip
    ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ํ•œ ๊ณณ์— ์„ค์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ์— ๋‚ด์žฅ๋œ ํŒŒ์ด์ฌ์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ, ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ virtualenv๋‚˜ venv์™€ ๊ฐ™์ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋‹ค๋ฃจ๋Š” ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • virtualenv
    ํŒŒ์ด์ฌ ๊ฐ€์ƒ ํ™˜๊ฒฝ ๊ด€๋ฆฌ์ž๋กœ, ํŒจํ‚ค์ง€๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋”ฐ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Anaconda
    Conda๋ผ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž + ๊ฐ€์ƒ ํ™˜๊ฒฝ ๊ด€๋ฆฌ์ž๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ˆ˜ํ•™/๊ณผํ•™/๊ณตํ•™ ์—…๋ฌด์— ํ•„์š”ํ•œ NumPy, SciPy, Jupyter Notebook ๋“ฑ์˜ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒจํ‚ค์ง€์™€ ๋„๊ตฌ๋ฅผ ํ•œ๋ฒˆ์— ๊น”์•„์ค„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ GUI๋„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ†ต๊ณ„๋‚˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค, ์ธ๊ณต์ง€๋Šฅ ๋“ฑ์˜ ๋ถ„์•ผ ์ชฝ ํŒŒ์ด์ฌ ์ž…๋ฌธ์ž๋“ค์—๊ฒŒ ์ถ”์ฒœํ•˜๋Š” ํŽธ์ด๋‹ค. ๋‹ค๋งŒ ์„ค์น˜์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ์–ด์ฐจํ”ผ ๋ช‡๋ฐฑ ๊ฐœ๋‚˜ ๋˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋‹ค ์“ธ ์ผ์€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Conda ์‚ฌ์šฉ์— ์ˆ™๋ จ๋˜๋ฉด ์•„๋ž˜์— ๋‚˜์˜จ Miniconda๋ฅผ ์“ฐ๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค. 2020๋…„ ๋ถ€ํ„ฐ ์ •๋ถ€ ๋ฐ 200์ธ ์ด์ƒ ๊ธฐ์—…์—๊ฒŒ๋Š” ์œ ๋ฃŒ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.
  • Miniconda
    ์œ„์˜ Anaconda์™€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜์ง€๋งŒ, ํŒจํ‚ค์ง€๋Š” ์ž๊ธฐ๊ฐ€ ์ง์ ‘ ์ฐพ์•„์„œ ๊น”์•„์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์ฐจํ”ผ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ #conda install <ํŒจํ‚ค์ง€๋ช…> ๋ช‡๋ฒˆ๋งŒ ๋‘๋“œ๋ ค ๋ณด๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋œ๋‹ค. ์ด๊ฒƒ๋„ ์•„๋‚˜์ฝ˜๋‹ค์˜ ๋ณ€ํ˜•์ด๋ผ์„œ ์ •๋ถ€ ๋ฐ 200์ธ ์ด์ƒ ๊ธฐ์—…์—๊ฒŒ๋Š” ์œ ๋ฃŒ.

6.1.5. ์ฝ”๋“œ ๊ฒ€์‚ฌ[ํŽธ์ง‘]

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๊ฐ€ ์ž˜ ์“ฐ์˜€๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ. ํŒŒ์ด์ฌ์€ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ๋ฌธ๋ฒ• ๊ทœ์น™์ด ์ผ๊ด€์ ์ด์ง€๋งŒ, ํ•œ ์ค„์˜ ๊ธธ์ด๋‚˜ ๋ฌธ์ž์—ด์„ ๊ฐ์‹ธ๋Š” ๋”ฐ์˜ดํ‘œ(""/'') ๋“ฑ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋…ผ์Ÿ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ๋งŒํ•œ ์š”์†Œ๋Š” ๋งŽ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ํ†ต์ผํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ํ˜‘์—…ํ•˜๋ฉด์„œ ์ƒ๊ธฐ๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋”ฉํ•˜๋Š” ์ค‘์—๋„ ์˜ค๋ฅ˜๋‚˜ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒ„๊ทธ๋ฅผ ์ผ์ฐ ์žก์•„๋‚ด๊ณ  ํ…Œ์ŠคํŠธ์— ๋“œ๋Š” ๋…ธ๋ ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ ๊ฒ€์‚ฌ ๋„๊ตฌ์˜ ํ•œ ๊ฐˆ๋ž˜๋กœ ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ ๋„๊ตฌ(type checker)๊ฐ€ ์žˆ๋‹ค. ๋™์  ์–ธ์–ด๋ผ์„œ ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜•์„ ๋”ฐ๋กœ ์ฒดํฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ด์ฌ์„ ์œ„ํ•ด, ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ถ„์„ํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€, ํŠน์ • ํ•จ์ˆ˜์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š”์ง€์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋น„์Šทํ•œ ๋™์  ์–ธ์–ด์ธ JavaScript์— ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” TypeScript์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•œ TypeScript์™€ ๋‹ฌ๋ฆฌ Python์€ ์–ธ์–ด ์ฐจ์›์—์„œ type hint๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—[35] type hint๋ฅผ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ๋„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ฝ”๋“œ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ
    • Pylint: Python ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์˜ค๋ฅ˜๋‚˜ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๋ฌธ๋ฒ•์„ ์žก์•„๋‚ด๋Š” ๋„๊ตฌ์ด๋‹ค.
    • Flake8: Pylint์— ๋น„ํ•ด ๋œ ๊ผผ๊ผผํ•œ ๋Œ€์‹  ๋” ๋น ๋ฅด๋‹ค.
  • ์ž๋ฃŒํ˜•(ํƒ€์ž…) ๊ฒ€์‚ฌ
    • MyPy: ํŒŒ์ด์ฌ์„ ์œ„ํ•œ ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ ๋„๊ตฌ์˜ ์›์กฐ๋กœ, ์ˆœ์ˆ˜ Python์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.
    • Pyre: ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ ๋„๊ตฌ๋กœ, Ocaml๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.
    • Pyright: ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๊ฐœ๋ฐœํ•œ ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ ๋„๊ตฌ๋กœ, TypeScript๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. Visual Studio Code ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ •์‹ ์ง€์›ํ•˜๋ฉฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์•„๋‹Œ ๋ช…๋ น์ค„ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.
    • Pytype: ๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ ๋„๊ตฌ์ด๋‹ค.
  • ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ ๋ฐ ์ˆ˜์ •
    • autopep8: ํŒŒ์ด์ฌ ๊ณต์‹ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์ธ PEP 8์— ๋งž๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ์ค€๋‹ค.
    • yapf: ๊ตฌ๊ธ€์—์„œ ๊ฐœ๋ฐœํ•œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ ๋„๊ตฌ.
    • Black: ๋‹ค๋ฅธ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ ๋„๊ตฌ์— ๋น„ํ•ด ๋งค์šฐ ์—„๊ฒฉํ•œ ๊ฒƒ์ด ํŠน์ง•์œผ๋กœ, ์ฝ”๋”ฉ ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ์•„์˜ˆ ๋…ผ์Ÿ์„ ๋ชปํ•˜๊ฒŒ ํ•œ ๊ฐ€์ง€ ์Šคํƒ€์ผ์„ ๊ฐ•์š”ํ•œ๋‹ค๋Š” ์ปจ์…‰์„ ๊ณ ์ˆ˜ํ•œ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฒ€์‚ฌ ๋„๊ตฌ์— ๋น„ํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋งค์šฐ ์ ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์•„๋‹ˆ๋ผ Black์ด ๊ฐ•์š”ํ•˜๋Š” ์Šคํƒ€์ผ์„ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, ๋Œ€์‹  Black์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์ฝ”๋“œ๋Š” ๋ˆ„๊ฐ€ ์“ฐ๋“  ๋น„์Šท๋น„์Šทํ•ด์„œ ๊ธˆ๋ฐฉ ์ต์ˆ™ํ•ด์ง„๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๊ฒฝ์จ์•ผ ํ•  ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค๋Š” ์  ๋•๋ถ„์— ํ›„๋ฐœ์ฃผ์ž์ž„์—๋„ ๋น ๋ฅด๊ฒŒ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ๋‹ค.
    • isort: import ๋ฌธ์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ •๋ ฌํ•ด ์ค€๋‹ค.

6.2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ[ํŽธ์ง‘]

  • ๋ทฐํ‹ฐํ’€ ์ˆ˜ํ”„(Beautiful Soup): XML, HTML์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ ๋˜๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • dateutil: ๋ณต์žกํ•œ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ํ˜•์‹์„ ๋‹ค๋ฃจ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ datetime๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋‚ ์งœ/์‹œ๊ฐ„ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋‚˜ ๊ตญ์ œ ์‹œ๊ฐ„์— ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ํ•„๋กœ์šฐ(Pillow): PIL์€ ๊ฐœ๋ฐœ์ด ์˜ˆ์ „์— ์ค‘์ง€๋˜์—ˆ๊ณ , PIL์˜ ํฌํฌ(fork)์ธ Pillow๊ฐ€ ๊ทธ ์—ญํ• ์„ ๋Œ€์‹ ํ•˜๊ณ  ์žˆ๋‹ค. Pillow๋ฅผ ์“ฐ์ž. PIL์€ Python Imaging Library์˜ ๋จธ๋ฆฟ๊ธ€์ž๋กœ ๊ฐ„ํŽธํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • PyYAML: YAML ํ˜•์‹์˜ ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • requests: HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‚ด์žฅ๋œ urllib ๋ชจ๋“ˆ์— ๋น„ํ•ด ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•˜๊ณ  ๊ธฐ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค.
  • tossi: ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ๋ฅผ ๊ฐœ๋ฐœํ•œ ์™“ ์ŠคํŠœ๋””์˜ค์—์„œ ๊ฐœ๋ฐœํ•œ ํ•œ๊ตญ์–ด ์กฐ์‚ฌ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๊ฐ™์€ ์ธ๋ฌผ์ด ๋งŒ๋“  korean ๋ชจ๋“ˆ์„ ๋Œ€์ฒดํ–ˆ๋‹ค.
  • argparser ํ„ฐ๋ฏธ๋„์—์„œ ๋ช…๋ น์–ด parser ์ง€์› ์˜ˆ์ œ

6.2.1. ์ˆ˜ํ•™[ํŽธ์ง‘]

๋ฒ”์šฉ์„ฑ์„ ์ง€๋‹Œ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค
  • ์‹ฌํŒŒ์ด(SymPy): ์ธ์ˆ˜ ๋ถ„ํ•ด, ๋ฏธ๋ถ„, ์ ๋ถ„ ๋“ฑ ์‹ฌ๋ณผ๋ฆญ ์—ฐ์‚ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋„˜ํŒŒ์ด(NumPy): ํ†ต๊ณ„, ์„ ํ˜• ๋Œ€์ˆ˜, ํ–‰๋ ฌ ๊ณ„์‚ฐ, ๊ธˆ์œต ์šด์šฉ ๋“ฑ์„ ํฌํ•จํ•œ ๊ณผํ•™ ๊ณ„์‚ฐ๊ณผ ์ˆ˜ํ•™ ์ž‘์—…. ์ˆ˜์น˜ ํ•ด์„, ํŠนํžˆ ์„ ํ˜• ๋Œ€์ˆ˜(linear algebra) ๊ณ„์‚ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ž๋ฃŒํ˜•์ด ๊ณ ์ •๋œ ๋‹ค์ฐจ์› ๋ฐฐ์—ด ํด๋ž˜์Šค(n-dimensional array)์™€ ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ(vectorized operation)์„ ์ง€์›ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ Numpy๋Š” C์–ธ์–ด๋กœ ์ œ์ž‘๋˜์–ด, ํŒŒ์ด์ฌ ๋‹ต์ง€ ์•Š์€ ๋„˜์‚ฌ๋ฒฝ ์ˆ˜์ค€์˜ ์†๋„๋ฅผ ์ž๋ž‘ํ•œ๋‹ค. ๊ผญ ์ˆ˜์น˜ํ•ด์„/์„ ํ˜•๋Œ€์ˆ˜ ๋ชฉ์ ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ฐฐ์—ดํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์†๋„๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋†’์ด๋Š” ์•ผ๋งค ์ˆ˜์ค€์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ธ์ดํŒŒ์ด(SciPy): ๊ณ ์„ฑ๋Šฅ ์„ ํ˜•๋Œ€์ˆ˜, ํ•จ์ˆ˜ ์ตœ์ ํ™”, ์‹ ํ˜ธ ์ฒ˜๋ฆฌ, ํŠน์ˆ˜ํ•œ ์ˆ˜ํ•™ ํ•จ์ˆ˜์™€ ํ†ต๊ณ„ ๋ถ„ํฌ ๋“ฑ ๊ณผํ•™ ๊ณ„์‚ฐ์šฉ ํ•จ์ˆ˜๋ฅผ ๋ชจ์•„๋†“์€ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€์ด๋‹ค. ๊ณ ๊ธ‰ ์ˆ˜ํ•™ ํ•จ์ˆ˜, ์ˆ˜์น˜์  ๋ฏธ์ ๋ถ„, ๋ฏธ๋ถ„ ๋ฐฉ์ •์‹ ๊ณ„์‚ฐ, ์ตœ์ ํ™”, ์‹ ํ˜ธ ์ฒ˜๋ฆฌ ๋“ฑ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ณผํ•™ ๊ธฐ์ˆ  ๊ณ„์‚ฐ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋œ๋‹ค.

6.2.2. ๋ฐ์ดํ„ฐ[ํŽธ์ง‘]

๋น… ๋ฐ์ดํ„ฐ, ํ†ต๊ณ„ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
  • ํŒ๋‹ค์Šค(pandas): ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋ถ„์„์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ํ…Œ์ด๋ธ” ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame) ์ž๋ฃŒํ˜•์„ ์ œ๊ณตํ•œ๋‹ค. R์˜ data.frame์„ ๋ณธ๋– ์„œ ์„ค๊ณ„ํ•œ DataFrame์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. Visualizing Pandas' Pivoting and Reshaping Functions ์ฐธ์กฐ.
  • ๋‹ค์Šคํฌ(Dask) : ํ™ˆํŽ˜์ด์ง€ ํŒ๋‹ค์Šค์˜ ๋ณ‘๋ ฌ&๋ถ„์‚ฐ์ฒ˜๋ฆฌ ๋ฒ„์ „. ํŒ๋‹ค์Šค๋ž‘ ์‚ฌ์šฉ๋ฒ•์ด ๊ฑฐ์˜ ๊ฐ™์œผ๋ฉด์„œ๋„ ๋“œ๋ผ๋งˆํ‹ฑํ•˜๊ฒŒ ๋นจ๋ผ์ง„๋‹ค. ๋‹ค๋งŒ ์•„์ง ๊ฐˆ ๊ธธ์ด ๋จผ ๊ฒƒ์ด ํ .
  • StatsModels: ํ†ต๊ณ„ ๋ฐ ํšŒ๊ท€ ๋ถ„์„, ์‹œ๊ณ„์—ด ๋ถ„์„์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

6.2.3. ๊ทธ๋ž˜ํ”„ (์ฐจํŠธ) ๊ทธ๋ฆฌ๊ธฐ[ํŽธ์ง‘]

์ˆ˜ํ•™์ด๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™”๋ฅผ ์ „๋ฌธ์ ์œผ๋กœ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋งทํ”Œ๋ž๋ฆฝ(matplotlib): ๊ณผํ•™ ๊ณ„์‚ฐ์šฉ ๊ทธ๋ž˜ํ”„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. Tkinter, wxPython, Qt, GTK+ ๋“ฑ์˜ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ž˜ํ”„์™€ ์ฑ ํŠธ ๋“ฑ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์‹œ๊ฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. pylab์ด๋ผ๋Š” ์„œ๋ธŒํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•˜์—ฌ MATLAB์˜ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋Šฅ์„ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์”จ๋ณธ(Seaborn): matplotlib์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ณ ๊ธ‰ ํ†ต๊ณ„ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ํ†ต๊ณ„์šฉ ์‹œ๊ฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • ๋ณด์ผ€(Bokeh): ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ์ด๋‚˜ ์›น์ƒ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ทธ๋ž˜ํ”„๋‚˜ ์ฐจํŠธ๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค.
  • Pygal: ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

6.2.4. ๋จธ์‹  ๋Ÿฌ๋‹[ํŽธ์ง‘]

๋จธ์‹  ๋Ÿฌ๋‹, ๋”ฅ ๋Ÿฌ๋‹ ์ „๋ฌธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ํ…์„œํ”Œ๋กœ์šฐ(TensorFlow): ๊ตฌ๊ธ€์—์„œ ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ณต๊ฐœํ•œ ๊ธฐ๊ณ„ ํ•™์Šต, ์ธ๊ณต ์‹ ๊ฒฝ๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • ์‚ฌ์ดํ‚ท๋Ÿฐ(scikit-learn): ํŒŒ์ด์ฌ์˜ ๋จธ์‹  ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • ํŒŒ์ดํ† ์น˜( PyTorch): ํ† ์น˜ ๊ธฐ๋ฐ˜์˜ ๊ธฐ๊ณ„ ํ•™์Šต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ตฌํ˜„๊ณผ ์„ฑ๋Šฅ์ด ๋น ๋ฅด๋ฉฐ, TensorFlow๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ์ตํžˆ๊ธฐ ํ›จ์”ฌ ์‰ฝ๋‹ค. ํ•™๊ณ„์—์„œ๋Š” 2017๋…„๋ถ€ํ„ฐ ์ด๋ฏธ ํŒŒ์ดํ† ์น˜๊ฐ€ ํ…์„œํ”Œ๋กœ์šฐ๋ณด๋‹ค ๋” ๋งŽ์ด ์–ธ๊ธ‰๋˜๊ณ  ์žˆ๋‹ค.
  • ์ผ€๋ผ์Šค(Keras): TensorFlow, Theano, CNTK ๋“ฑ ๋”ฅ ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์‰ฝ๊ฒŒ ๋‹ค์ธต ํผ์…‰ํŠธ๋ก  ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ, ์ปจ๋ณผ๋ฃจ์…˜ ์‹ ๊ฒฝ ๋ง ๋ชจ๋ธ, ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ, ์กฐํ•ฉ ๋ชจ๋ธ ๋“ฑ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. TensorFlow ๋“ฑ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋น„ํ•ด ์‰ฌ์šด ๋ฌธ๋ฒ•์ด ํŠน์ง•. ํ˜„์žฌ๋Š” TensorFlow์™€ ํ†ตํ•ฉ๋˜์—ˆ๋‹ค.

6.2.5. GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์—์„œ GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฒƒ์€ ํŒŒ์ด์ฌ์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ Tkinter์ด์ง€๋งŒ ๊ทธ ์™ธ์—๋„ wxPython, PyQt, PySide[36], PyGTK, SFML, pyglet๋„ ์“ฐ์ธ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” javascript์™€ python ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฐ„์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฑฐ์˜ ๊นจ์ฃผ๋Š” eel์„ ์‚ฌ์šฉํ•˜๋ฉด ์›น ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
6.2.5.1. tkinter[ํŽธ์ง‘]
tkinter๋Š” Tk interface์˜ ์•ฝ์ž์ด๋‹ค. Tk๋Š” GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Tcl์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ Tk์™€ ํ•จ๊ป˜ GUI์— ์“ฐ์ธ๋‹ค.
6.2.5.2. Qt for Python[ํŽธ์ง‘]
PySide2 ๋ชจ๋“ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Qt5 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก Qt(ํ”„๋ ˆ์ž„์›Œํฌ) ์ธก์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

6.3. ํ”„๋ ˆ์ž„์›Œํฌ[ํŽธ์ง‘]

6.3.1. ์›น ํ”„๋ ˆ์ž„์›Œํฌ[ํŽธ์ง‘]

Python์€ ์›น ์„œ๋ฒ„[37]์™€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(ํ”„๋ ˆ์ž„์›Œํฌ) ๊ฐ„์˜ ํ˜ธํ™˜์„ ์œ„ํ•ด ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๊ทœ๊ฒฉ์„ ์ œ์‹œํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” Java์˜ ์„œ๋ธ”๋ฆฟ์„ ๋ชจ๋ฐฉํ•œ WSGI์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋น„๋™๊ธฐํ˜•(async/await) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ASGI์ด๋‹ค. ์›น ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์›น ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•  ๋• ์„œ๋กœ ํ˜ธํ™˜์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ด ์™ธ์—๋„ ์ž์ฒด์ ์œผ๋กœ ์›น ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋…์ž์ ์ธ ๊ทœ๊ฒฉ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์žˆ๋‹ค.
  • WSGI ๊ธฐ๋ฐ˜ (๋™๊ธฐํ˜•)
    • Django: ํ’€ ์Šคํƒ ์›น ํ”„๋ ˆ์ž„์›Œํฌ. ์ •์‹์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ASGI ์„œ๋ฒ„์™€๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ˜ธํ™˜์ด ๋œ๋‹ค.
    • Flask: ๋งˆ์ดํฌ๋กœ ์›น ํ”„๋ ˆ์ž„์›Œํฌ. ๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ข‹์œผ๋‚˜, ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.์‚ฌ์šฉ๋ฐฉ๋ฒ•
  • ASGI ๊ธฐ๋ฐ˜ (๋น„๋™๊ธฐํ˜•)
    • FastAPI: Starlette์— ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Pydantic์„ ์–น๊ณ  ์ด๋Ÿฐ์ €๋Ÿฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, API ์„œ๋ฒ„๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์•Œ๋งž๋‹ค.

6.3.2. ๊ทธ ์™ธ[ํŽธ์ง‘]

7. ๊ด€๋ จ ํŒ[ํŽธ์ง‘]

  • ๋ฌธ์ž์—ด์„ ํ•ฉ์น  ๋•Œ join์„ ์“ฐ์ž. range ํ•จ์ˆ˜์™€ str ํ•จ์ˆ˜๋ฅผ ๊ฐ™์ด ์“ฐ๋ฉด ๋งค์šฐ ํŽธํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
    ''.join(str(x) for x in range(10))
  • ์Šฌ๋ผ์ด์Šค(slice) ๋ฌธ๋ฒ•์€ ๋ฆฌ์ŠคํŠธ/๋ฌธ์ž์—ด์˜ ๋ถ€๋ถ„์„ ์ž˜๋ผ๋‚ด๋Š” ๊ฒƒ ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    # ๋ฌธ์ž์—ด ๋’ค์ง‘๊ธฐ
    a = 'abc'
    print(a[::-1]) # ์ถœ๋ ฅ: cba
    
    # ๋ฆฌ์ŠคํŠธ ๋ณต์‚ฌ
    a = [1, 2, 3]
    b = a[:]
    print(b)      # ์ถœ๋ ฅ: [1, 2, 3]
    print(a is b) # ์ถœ๋ ฅ: False
    
    c = [[1, 2], [3, 4]]
    d = c[:]
    c[0] = [5, 6] # ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋Š” ๋ณต์‚ฌ๋˜์ง€๋งŒ
    c[1][0] = 7   # ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋“ค๊นŒ์ง€ ๋ณต์‚ฌ๋˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.
    print(c)      # ์ถœ๋ ฅ: [[5, 6], [7, 4]]
    print(d)      # ์ถœ๋ ฅ: [[1, 2], [7, 4]]
    print('%s, %s, %s' % (c is d, c[0] is d[0], c[1] is d[1])) # ์ถœ๋ ฅ: False, False, True
  • ์ˆซ์ž, ๋ฌธ์ž, ํŠœํ”Œ์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ(immutable)ํ•˜๋ฉฐ, ๋ฆฌ์ŠคํŠธ, ์ง‘ํ•ฉ, ๋”•์…”๋„ˆ๋ฆฌ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(mutable)ํ•˜๋‹ค. ์ด๋•Œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜•์€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜์—ฌ๋„ ๊ทธ ๋‚ด์šฉ์ด ๊ณต์œ ๋œ๋‹ค. ๊ทธ ์˜ˆ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.
    a = (1, 2, 3)
    b = a
    b += (2, 1)
    print(a) # ์ถœ๋ ฅ: (1, 2, 3)
    print(b) # ์ถœ๋ ฅ: (1, 2, 3, 2, 1)

    ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ, ํŠœํ”Œ b๋งŒ ๋ณ€๊ฒฝ๋˜๊ณ , a๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ ํŠœํ”Œ(immutable)์„ ๋ฆฌ์ŠคํŠธ(mutable)๋กœ ๋ฐ”๊พธ์–ด ๋ณด์ž.
    a = [1, 2, 3]
    b = a
    b += [2, 1]
    print(a) # ์ถœ๋ ฅ: [1, 2, 3, 2, 1]
    print(b) # ์ถœ๋ ฅ: [1, 2, 3, 2, 1]

    ์ถœ๋ ฅ์„ ๋ณด๋ฉด b๋งŒ ๋ณ€๊ฒฝํ–ˆ์Œ์—๋„ a๊ฐ€ ๋ณ€ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜•์— ์ ์šฉ๋˜๋ฉฐ, ์‹ฌ์ง€์–ด ๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ๋ฆฌ์ŠคํŠธ ๊ฐ™์€ ๊ฒƒ๋“ค๊นŒ์ง€๋„ ๊ณต์œ ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” list(), set(), dict()๋‚˜ copy ๋ชจ๋“ˆ ๋“ฑ์„ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜๊ณ  ์ž‘์—…ํ•˜์ž. ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜•์€ ์›๋ณธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น์‚ฌํ•ญ์ด ์—†๋‹ค.
    ํŠนํžˆ list๋‚˜ dict ์ž์ฒด๋ฅผ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์„ ๋•Œ ๋‚ด๋ถ€์—์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ํ•จ์ˆ˜ ๋ฐ–์—์„œ๋„ list๋‚˜ dict๊ฐ€ ๋ณ€ํ˜•๋˜๋‹ˆ ์ฃผ์˜ํ•˜๋„๋ก ํ•˜์ž.
  • list.insert(0) ์™€ list.append()๋Š” ๊ฐ๊ฐ ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ •๋„์˜ ์กฐ๊ทธ๋งŒํ•œ ์ฐจ์ด์ผ ๋ฟ์ด์ง€๋งŒ, ๊ณ„์‚ฐ ์‹œ๊ฐ„์ด O(N)๊ณผ O(1) ์ˆ˜์ค€์œผ๋กœ ์ฐจ์ด๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    ๊ทธ๋ž˜์„œ prepending์— ์˜์กดํ•˜๋Š” ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘๋Š” ๊ฒƒ์ด ์ข‹๊ณ , ๋งŒ์•ฝ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋’ค์ง‘๊ธฐ ํž˜๋“ค๋‹ค๋ฉด, ํŒŒ์ด์ฌ ๊ณต์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” deque ๊ฐ™์€ ๊ฒƒ์„ ์จ์•ผ ํ•œ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ฐ๊ฐ์ด ์žˆ์œผ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
    CPython๊ฐ™์€ ๊ฒฝ์šฐ JIT๋ฅผ ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฒƒ์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™” ํ•ด ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋ง์ž.
  • ๊ด„ํ˜ธ ์•ˆ์— for ๊ณผ if, else ๋ฅผ ๋„ฃ์„ ์‹œ ์ฃผ์˜ํ•˜์ž.
    #1
    list(x for x in range(10) if x%2 == 0)
    #2
    list(x for x in range(10) if x%2 == 0 else 0)
    #3
    list(x if x%2 == 0 else 0 for x in range(10))

    1์€ ๋˜์ง€๋งŒ 2๋Š” ๋˜์ง€ ์•Š์œผ๋ฉฐ 3์€ ๋œ๋‹ค. if๋งŒ ๋„ฃ์„ ๊ฒฝ์šฐ for ๋’ค์— ์จ์•ผ ํ•˜๋ฉฐ, ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์›์†Œ๋“ค์€ ์ƒ๋žต๋œ๋‹ค(์ฆ‰, 1์˜ ๊ฒฐ๊ณผ๋ฌผ์€ [0, 2, 4, 6, 8]์ด๋‹ค). if์™€ else ๋ชจ๋‘๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด for ์•ž์— ๋„ฃ์–ด์•ผ ํ•˜๋ฉฐ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฉด ๋งจ ์•ž, ์•„๋‹ˆ๋ผ๋ฉด else ๋‹ค์Œ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ํ˜ธ์ถœ๋œ ๊ฐ’(๋Œ€์ž…์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ)์€ _ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ๋‹ค. ๋˜ํ•œ ์ด ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•œ ๊ฐ’์€ ๋ฒ„๋ ค์ง„๋‹ค.
  • ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ์€ __main__ ๋ธ”๋Ÿญ ์•ˆ์— ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฌธ์ œ ๋•Œ๋ฌธ. ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฟœ๋Š”๋‹ค.
    #if ๋Œ€์‹  while๋„ ๊ฐ€๋Šฅ.
    if __name__ == '__main__':
  • ํŒŒ์ด์ฌ 2์™€ 3์—์„œ์˜ range๋Š” ๋ฆฌํ„ด ํ˜•์‹์ด ๋‹ค๋ฅด๋‹ค. 2์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜์ง€๋งŒ 3์—์„œ๋Š” range ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๋”ฐ๋ผ์„œ 3์—์„œ range๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ํŒŒ์ด์ฌ 2์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์€, ํŒŒ์ด์ฌ 3์˜ range๋Š” ํŒŒ์ด์ฌ 2์˜ xrange์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    list(range(10))
    [*range(10)]

    ๊ทธ ์™ธ์—๋„ ํŒŒ์ด์ฌ 2์™€ 3์€ ์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ, print ๋ฌธ๋ฒ•, ๋ฌธ์ž์—ด ์ข…๋ฅ˜, import ๋ฐฉ์‹ ๊ฐ™์€ ๋ฐ์„œ ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚˜๋Š” ํŽธ์ด๋‹ค. ์ผ๋ถ€๋Š” __future__์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŒŒ์ด์ฌ 2์—์„œ๋„ 3๊ณผ ๊ฐ™์€ ๋ฌธ๋ฒ•์„ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„๋“ค์€ stack overflow๋“ฑ์„ ์ฐธ๊ณ ํ•ด์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ˜„์žฌ ๋งŽ์€ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด __future__๋กœ ๋„๋ฐฐ๋˜์–ด ์žˆ๊ณ  ๊ฐ€๋‚ด ์ˆ˜๊ณต์—… ์‹์œผ๋กœ ํ˜ธํ™˜์„ฑ์„ ๋—Œ์งˆํ•ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ๋ง์ด๋‹ค. ํŒŒ์ด์ฌ 2.7์ด ๊ณต์‹์ ์œผ๋กœ ์ง€์›์ด ์ค‘๋‹จ๋˜๋ฉด ์‹œ์ ๊นŒ์ง€ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํŒŒ์ด์ฌ 2 ์ง€์›์„ ์ฒ ํšŒํ•  ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ ๋•Œ๊ฐ€ ๋˜๋ฉด ์ด๋Ÿฐ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์—์„œ ์ˆจํ†ต์ด ํŠธ์ผ ๊ฒƒ์ด๋‹ค.
  • Bolierplate ์ฝ”๋“œ๊ฐ€ ์ ๊ณ , ๋ฆฌ์ŠคํŠธ์™€ ์…‹, ํ•ด์‹œ ๋“ฑ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•œ ๊ธฐํ˜ธ๋กœ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์‹œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์ด๊ธฐ๋„ ํ•˜๋‹ค. Python์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ C++, Java ๋“ฑ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ์ „์ฒด์ ์ธ ์ฝ”๋“œ ๊ธธ์ด๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ์งง์•„์ง„๋‹ค.
  • ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ผ๋„ ์—ด์–ด์„œ ์•„๋ฌด ๋ชจ๋“ˆ์ด๋‚˜ ์ž„ํฌํŠธํ•˜๊ฑฐ๋‚˜, print ํ•จ์ˆ˜์— ๋Œ€ํ•ด dir(print)๋ฅผ ์ž…๋ ฅํ•ด๋ณด๋ฉด ํŒŒ์ด์ฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ข€ ๋” ์ž˜ ์•Œ๊ฒŒ ๋œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ผ ๊ฒƒ์ด๋‹ค.

8. ๋ฌธ๋ฒ•[ํŽธ์ง‘]

9. ๋„์„œ[ํŽธ์ง‘]

ํŒŒ์ด์ฌ์€ 2021๋…„ ํ˜„์žฌ๊นŒ์ง€๋„ ์ด๊ฑฐ๋‹ค! ํ•  ๋งŒํ•œ ๋ช…์ €๊ฐ€ ์—†๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ๋ถ€ํ„ฐ ์‹ค์‚ฌ์šฉ๊นŒ์ง€ ์˜ค๋งŒ๊ฐ€์ง€ ์ฑ…๋“ค์ด ๋‚œ๋ฆฝํ•ด ์žˆ์–ด์„œ ํ•ต์‹ฌ์„ ๊ด€ํ†ตํ•˜๋Š” ์ฃผ์ œ๋ฅผ ๋”ฑํžˆ ์žก๊ธฐ ์–ด๋ ค์›Œ์„œ์ธ ๋“ฏ ํ•˜๋‹ค. (--์‚ฌ์‹ค ๊ธฐ๋ณธ๊ธฐ์™€ ๊ฐœ๋…๋งŒ ์ œ๋Œ€๋กœ ์ตํžŒ ๋‹ค์Œ์—๋Š” ์ œ์ผ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ๊ตฌ๊ธ€๋ง์ด๋ผ ์นด๋”๋ผ.--)

ํŒŒ์ด์ฌ ๊ด€๋ จ ์ฑ…์€ ๋Œ€ํ˜• ์„œ์ ์— ๊ฐ€๋ฉด ํŒŒ์ด์ฌ ๋ถ„๋ฅ˜๊ฐ€ ๋”ฐ๋กœ ์žกํ˜€์„œ ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ๋‚œ๋ฆฝํ•ด ์žˆ์„ ์ •๋„๋กœ ๊ฒฝ์Ÿ์ด ์น˜์—ดํ•˜๋‹ค. ํŒŒ์ด์ฌ๋งŒ ๋”ฐ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ์žกํ˜€์„œ ๋งค๋Œ€๋ฅผ ๊ฝ‰ ์ฑ„์šด ํŒŒ์ด์ฌ ์ฑ…๋“ค์„ ๋ณด๋‹ค ๋ณด๋ฉด ์ถ˜์ถ”์ „๊ตญ์‹œ๋Œ€ ์ €๋ฆฌ๊ฐ€๋ผ ํ•  ์ˆ˜์ค€์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„์„œ๋“ค์ด ์ฃ„๋‹ค ํŠน์ • ๋ถ„์•ผ์—๋งŒ ์น˜์ค‘ํ•ด์„œ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ๊ด€ํ†ตํ•œ ์ฑ…์€ ๋ณ„๋กœ ์—†๋Š”๊ฒŒ ๋ฌธ์ œ์ด๋‹ค. Ruby๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ธฐํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— Programming Ruby ๋”ฑ ํ•œ๊ถŒ๋งŒ ๋‹ฌ์•„๋†”๋„ ์žฌ๊ณ ๊ฐ€ ์—†์„ ์ •๋„๋กœ ์ธ๊ธฐ์ธ ๊ฒƒ๊ณผ ์ • ๋ฐ˜๋Œ€. Python์€ ์ฑ…์ด ์›Œ๋‚™ ๋งŽ๋‹ค๋ณด๋‹ˆ ์„œ์ ์—๋„ ์žฌ๊ณ ๊ฐ€ ์ˆ˜๋‘๋ฃฉํ•˜๋‹ค.
๋ฐ”๋กœ ์“ฐ๋Š” ํŒŒ์ด์ฌ(๊ธฐ์ดˆํŽธ)
์„œ์šธ๋Œ€ํ•™๊ต์˜ ์ผ๋ถ€ ๊ฐ•์ขŒ์—์„œ ์ด๋ฒˆํ•™๊ธฐ ํ•™๋ถ€ ์ˆ˜์—…์šฉ ๊ต์žฌ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์˜€๋‹ค.
Do It! ์ ํ”„ ํˆฌ ํŒŒ์ด์ฌ
๋Œ€ํ•œ๋ฏผ๊ตญ์—์„œ ์ž…๋ฌธ ์„œ์ ์œผ๋กœ๋Š” ์œ„ํ‚ค๋…์Šค์— ์—ฐ์žฌ๋œ ๊ฐ•์˜๋ฅผ ํŽธ์ง‘ํ•œ Do It! ์ ํ”„ ํˆฌ ํŒŒ์ด์ฌ์ด๋ผ๋Š” ์„œ์ ์ด ์ธ๊ธฐ๊ฐ€ ๋งŽ๋‹ค. ์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ถ€๋ฌธ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ ์ˆ˜์ค€. ๊ธฐ์ดˆ์ ์ธ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๋ฉฐ ๋Œ€์ƒ ๋…์ž๋„ ๋น„์ „๋ฌธ๊ฐ€๋ผ ๋งค์šฐ ๊นŠ์ด ์žˆ๋Š” ์ฑ…์ด๋ผ ๋ณด๊ธฐ๋Š” ์–ด๋ ต๊ณ  ์–ด๋””๊นŒ์ง€๋‚˜ ์ž…๋ฌธ ์„œ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ๊ตญ์—์„œ๋งŒ ์ธ๊ธฐ๊ฐ€ ์žˆ๊ณ , ์ ํ”„ ํˆฌ ํŒŒ์ด์ฌ ์ •๋„์˜ ์ž…๋ฌธ์„œ๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ๋งŽ๋‹ค. ์„œ์ ์— ๊ฐ€๋ฉด ๋งค๋Œ€์— ๊น”๋ฆฐ๊ฒŒ ์ ํ”„ ํˆฌ ํŒŒ์ด์ฌ ์ •๋„์˜ ์ž…๋ฌธ์„œ๋“ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ์ฑ…์€ ํ•œ๊ตญ ๊ตญ๋‚ด์— ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ˜•์„ฑ(๋„ค์ด๋ฒ„ ์นดํŽ˜)๋˜์–ด ์žˆ์–ด์„œ ์งˆ๋ฌธ/๋‹ต๋ณ€์ด ๋นจ๋ผ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ์— ์˜ฌ๋ž๋‹ค.
ํŒŒ์ด์ฌ ์‰ฝ๊ฒŒ, ๋” ์‰ฝ๊ฒŒ
2014๋…„ ํŒ
2017๋…„ ๊ฐœ์ •ํŒ
๋˜๋‹ค๋ฅธ ์ž…๋ฌธ์„œ๋กœ๋Š” ์ผ๋ณธ์—์„œ ์ธ ์ง€ ์‹ ๊ณ ๊ฐ€ ์จ์„œ ๋‚˜์˜จ ํŒŒ์ด์ฌ ๋” ์‰ฝ๊ฒŒ, ๋” ๊นŠ๊ฒŒ(์›ํŒ) ํŒŒ์ด์ฌ ์‰ฝ๊ฒŒ, ๋” ์‰ฝ๊ฒŒ(2017๋…„ ๊ฐœ์ •ํŒ)๊ฐ€ ์žˆ๋‹ค. 2014๋…„ ํŒ์€ Python 2 ๊ธฐ์ค€์ด๊ณ  2017๋…„ ํŒ์€ Python 3 ๊ธฐ์ค€์ด๋‹ค.

Python ์ž…๋ฌธ์„ ๋ฒ—์–ด๋‚˜๊ณ  ๋‚˜๋ฉด, ๊ธฐ๊ณ„ํ•™์Šต ๋ถ„์•ผ๋กœ ๊ฐˆ ๊ฒƒ์ด๋ƒ, ๋น…๋ฐ์ดํ„ฐ ๋ถ„์•ผ๋กœ ๊ฐˆ ๊ฒƒ์ด๋ƒ์— ๋”ฐ๋ผ์„œ ์ถ”์ฒœ ๋„์„œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ์ƒํ™œ์ฝ”๋”ฉ์—์„œ๋„ ์ด๊ฑฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ ๋ฌธ์˜๊ฐ€ ํŽ˜์ด์Šค๋ถ ํŽ˜์ด์ง€์— ์˜ฌ๋ผ์˜ค๋Š” ํŽธ์ด๋‹ค.
๋น…๋ฐ์ดํ„ฐ ๋ถ„์•ผ(๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์•ผ)๋กœ ๊ฐ€๋Š” ๋ฐ์—๋Š” ์ฑ…์ด ๋งŽ์€๋ฐ ํ•™์› ๊ต์žฌ๋กœ๋Š” ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ž…๋ฌธ: ์—‘์…€ ๋ฐ CSV ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์‹œ๊ฐํ™”, ํ†ต๊ณ„๋ถ„์„, ์ž๋™ํ™”๊นŒ์ง€๋ผ๋Š” ์ฑ…์„ ๋งŽ์ด ์“ด๋‹ค. ์ด ๋ถ„์•ผ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Pandas ์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Pandas ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ ์›จ์Šค ๋งฅํ‚ค๋‹ˆ(Wes Mckinney)๊ฐ€ ์ €์ˆ ํ•œ 'ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„'์œผ๋กœ ์‹œ์ž‘ํ•ด๋„ ์ข‹๋‹ค.
๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹
Python ๊ธฐ๊ณ„ํ•™์Šต ๋”ฅ๋Ÿฌ๋‹ ๋ถ„์•ผ๋งŒํผ์€ ๋ช…์ €๊ฐ€ ํ•˜๋‚˜ ๋‚˜์™”๋‹ค. ์ผ๋ณธ์˜ ์‚ฌ์ดํ†  ๊ณ ํ‚ค๊ฐ€ ์“ด "๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹"์ด๋ผ๋Š” ์ฑ…์ด๋‹ค. ์›์„œ ์ผ๋ณธ์–ด๋กœ ๋‚˜์™”๋Š”๋ฐ, ์ผ๋ณธ ๋‚ด์—์„œ ์‚ฌ์ดํ†  ๊ณ ํ‚ค๊ฐ€ ์ง์ ‘ ๊ฐ์ˆ˜๋ฅผ ๋งก์€ ์˜์–ดํŒ์ด ๊ฐ™์ด ๋‚˜์™€ ์ด ์˜์–ดํŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฏธ๊ตญ์—์„œ ์ธ๊ธฐ๋ฅผ ๋Œ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2016๋…„ ๊ตฌ๊ธ€ ๋”ฅ๋งˆ์ธ๋“œ ์ฑŒ๋ฆฐ์ง€ ๋งค์น˜๋กœ ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ๊ฐ€ ํ•œ๊ตญ ์ผ๋ฐ˜์ธ์—๊ฒŒ ์•Œ๋ ค์ง€๋ฉด์„œ ํ•ด๋‹น ๋„์„œ๊ฐ€ 2017๋…„ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ ์ถœ๊ฐ„๋˜์—ˆ๋‹ค. ๋ฒˆ์—ญ ์งˆ๋„ ๊ต‰์žฅํžˆ ๊น”๋”ํ•ด์„œ ๋ณด๊ธฐ ์ข‹๋‹ค. ๊ฒฐ์ •์ ์œผ๋กœ ์ฑ…์ด ๋‘๊ป์ง€ ์•Š๊ณ  ์–‡๋‹ค. ์–‡์€ ์ฑ…์ธ๋ฐ ํ•ต์‹ฌ๋งŒ ์ง‘์–ด๋„ฃ์–ด์„œ ์ด๋ก ์„ ์™„์„ฑํ•ด๊ฐ€์ง€๊ณ  ๋Œ€ํ†ต์ผ ๋ช…์ €๋กœ ๊ผฝํžŒ๋‹ค.

ํ•œ๊ตญ ๊ตญ๋‚ด์—์„œ ์ฃผ์‹ ํˆฌ์ž๋ฅผ ํ•˜๋Š” ์‚ฌ๋žŒ ์ค‘์—์„œ ์ด๋ฅธ๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠธ๋ ˆ์ด๋”ฉ, ์‰ฝ๊ฒŒ๋งํ•ด ๊ฐœ์ธํŒ ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค[38]๋ฅผ ์งœ๋ ค๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ ์‚ฌ๋žŒ๋“ค์€ ํŒŒ์ด์ฌ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠธ๋ ˆ์ด๋”ฉ์ด๋ผ๋Š” ์ฑ…์ด ์ธ๊ธฐ๊ฐ€ ์ข‹๋‹ค. ํ•œ๊ตญ ๊ฐœ๋ฏธํˆฌ์ž์ž๋“ค์ด ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›€์ฆ๊ถŒ, ๋ฏธ๋ž˜์—์…‹๋Œ€์šฐ, ์ด๋ฒ ์ŠคํŠธํˆฌ์ž์ฆ๊ถŒ, ๋Œ€์‹ ์ฆ๊ถŒ API๋ฅผ ํ™œ์šฉํ•ด, ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ์„œ ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์›๋ž˜ Python ์†๋„๊ฐ€ ๋А๋ ค์„œ ์›๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠธ๋ ˆ์ด๋”ฉ(๊ฐœ์ธ ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค)๋Š” Python๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅธ R์ด๋‚˜ C์–ธ์–ด๋กœ ํ•˜๋Š”๊ฒŒ ์›์น™์ด๋‹ค. ๋ฏธ๊ตญ ๊ธˆ์œต์—…๊ณ„์—์„œ๋Š” R๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค๋ฅผ ๊ฐ€๋ฅด์นœ๋‹ค.[39] ๊ทธ๋Ÿฐ๋ฐ ํ•œ๊ตญ์—์„œ๋Š” ์ฃผ์‹ ํˆฌ์ž์ž๋“ค ๋ณด๊ณ  Python ์™ธ์— R์ด๋‚˜ C์–ธ์–ด๊นŒ์ง€ ๋ฐฐ์šฐ๋ผ๊ณ  ํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”์ง€, Python ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠธ๋ ˆ์ด๋”ฉ ์ฑ…์ด ๋‚˜์™”๋‹ค. ํ•ด๋‹น ์ฑ…์€ 2017๋…„ ๋‚˜์˜จ ์ดํ›„ ์ธ๊ธฐ๋ฅผ ๋Œ์–ด์„œ 2019๋…„ ๊ฐœ์ •ํŒ์ด ๋‚˜์˜ฌ ์ •๋„๊ฐ€ ๋๋‹ค.
ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ
Python์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๋Š” ์ฑ…๋„ ๋‚˜์™€ ์žˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€ํšŒ๋‚˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์‹œ C++์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ด์™”์œผ๋‚˜ ์ง๊ด€์ ์ด๊ณ  ์‰ฌ์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ธํ•ด Python์ด ์ ์  ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋‹ค. ์ด ์ฑ…์€ ๊ตญ๋‚ด ์ฒซ ์ถœ๊ฐ„๋œ Python ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ฑ…์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ทธ๋ฆผ์œผ๋กœ ๋„์‹ํ™”ํ•ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๊ณ , ์นด์นด์˜ค ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๊ธฐ์ถœ ๋ฌธ์ œ ํฌํ•จ ์ฃผ์ œ๋ณ„ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ๋‹ค์–‘ํ•œ ๊ฐ๋„์—์„œ ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ•˜์—ฌ ์ข‹์€ ๋ฐ˜์‘์„ ์–ป๊ณ  ์žˆ๋‹ค. ๋‚˜๋ฌด์œ„ํ‚ค ๋˜ํ•œ ์ด ์ฑ…์—์„œ ์‚ฌ์šฉ์„ ํ—ˆ๋ฝํ•œ ์ผ๋Ÿฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํšจ๊ณผ์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

10. ์—ฌ๋‹ด[ํŽธ์ง‘]

  • ๊ตฌ๊ธ€์—์„œ python์ด๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ œ์ผ ์œ„์— ๋œจ๋Š” ๊ฒŒ ๋ฐ”๋‹ค ๊ดด๋ฌผ์ด๋‚˜ ๋ฑ€์ด ์•„๋‹ˆ๋ผ ์ด๊ฑฐ๋‹ค.
  • pyBreakout์ด๋ผ๋Š” ๊ฒŒ์ž„์€ ํŒŒ์ด์ฌ์œผ๋กœ๋งŒ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ์˜ค๋กœ์ง€ pygame๋งŒ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ดˆ๋“ฑํ•™์ƒ์ด๋‹ค.
  • Python์˜ ๊ณต์‹ documentation์€ ์ •๋ง ํ˜•ํŽธ์—†๊ธฐ๋กœ ์œ ๋ช…ํ•˜๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์ง๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์˜ˆ์‹œ๊ฐ€ ๋ถ€์‹คํ•œ ๊ฒƒ์ด ๊ทธ ์ด์œ ์ธ๋ฐ, ๊ผญ ํ•„์š”ํ•  ๋•Œ ์ฝ์œผ๋ ค๋ฉด ํ—ค๋งค๊ธฐ ์‹ญ์ƒ์ด๋‹ค. ์‹ฌ์ง€์–ด ์ด๋Š” ๊ตญ๋‚ด๋„ ์•„๋‹Œ ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ๊ณต๋ก ์ธ๋ฐ, Python์„ ์ฐฌ์–‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค๋„ ์ธ์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๋‹ค๋งŒ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ๊ฐ€๋…์„ฑ์ด ์กฐ๊ธˆ์”ฉ ๊ฐœ์„ ๋˜์–ด ๊ฐ€๊ณ  ์žˆ๋‹ค.
  • Google Android OS์—์„œ๋Š” ๊ณต์‹์ ์œผ๋กœ Python์„ ๋ฏธ์ง€์›ํ•œ๋‹ค. ํ•˜์ง€๋งŒ SL4A๋‚˜ Linux Emulator๋ฅผ ์„ค์น˜ ํ›„ Python ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.๋น„๊ต๋‚ด์šฉ
  • ๋งŒ์•ฝ ํŒŒ์ด์ฌ์œผ๋กœ ์ง  ์ฝ”๋“œ๊ฐ€ ์ž˜ ์ž‘๋™๋˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ๊ฐ€๋…์„ฑ์ด ๋†’๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์šด ์ฝ”๋“œ๋ผ๋ฉด ์ด๋ฅผ ํŒŒ์ด์ฌ๋‹ค์šด(pythonic, ํŒŒ์ด์จ๋‹‰) ์ฝ”๋“œ๋ผ๋ฉฐ ๋Œ€์šฐํ•œ๋‹ค. ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด ์ด๋Ÿฌํ•œ ํŒŒ์ด์จ๋‹‰ ์ฝ”๋“œ๋ฅผ ์ง€ํ–ฅํ•ด์•ผ ํ•œ๋‹ค.
  • C++, Java์™€ ํ•จ๊ป˜ ๊ตฌ๊ธ€์˜ 3๋Œ€ ๊ฐœ๋ฐœ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค.
  • ๋ฌธ๋ช… 4์˜ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ์“ฐ์˜€๋‹ค. Lua์™€ ๋”๋ถˆ์–ด ๊ฒŒ์ž„ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์˜ ์–‘๋Œ€ ์‚ฐ๋งฅ.
  • ์‹ฌ์ฆˆ 4 ์—ญ์‹œ Python์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ด์ง ๋ณด๋ฉด ์ˆ˜๋งŽ์€ .pyo ํŒŒ์ผ๋“ค์˜ ํ–ฅ์—ฐ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ฆˆ 4์˜ ์ตœ์ ํ™”๋Š” ๋‚˜๋ฆ„ ์šฐ์ˆ˜ํ•œ ํŽธ. ๊ทผ๋ฐ pyo๊ฐ€ 3.5 ๋ฒ„์ „์—์„œ ์‚ญ์ œ๋˜๊ณ  pyc๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.
  • ํ‚น๋ค ์–ธ๋” ํŒŒ์ด์–ด์˜ ์—”์ง„์—๋„ ์“ฐ์˜€๋‹ค. 500์—ฌ ๊ฐœ์˜ ์ž์ฒด๋ชจ๋“ˆ์ด ๋ˆ„๋”๊ธฐ์ฒ˜๋Ÿผ ๋Œ์•„๊ฐ”๋‹ค๊ณ  ํ•œ๋‹ค.
  • ์›”๋“œ ์˜ค๋ธŒ ํƒฑํฌ๋Š” ์ƒ๋‹น ๋ถ€๋ถ„์ด ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“œ๋„ ๋กœ์ง ๋ถ€๋ถ„์€ ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.
  • EVE ์˜จ๋ผ์ธ์€ Python์˜ ๊ฒฝ๋Ÿ‰/๊ณ ์† ์‹คํ–‰ ๋ฒ„์ „์ธ Stackless Python์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ๊ฐœ๋ฐœ์‚ฌ CCP Games๋Š” ํŒŒ์ด์ฌ ์žฌ๋‹จ์˜ ์ •์‹ ํ›„์›์ž์ด๊ธฐ๋„ ํ•˜๋‹ค. 2000๋…„๋Œ€ ์ดˆ์— ์‹ฑ๊ธ€์ฝ”์–ด CPU๊ฐ€ ๊ณ„์† ์“ฐ์ผ ์ค„ ์•Œ๊ณ  ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฒ„์ „ ํŒŒ์ด์ฌ์œผ๋กœ ์งฐ๋‹ค๊ฐ€ ๋‹ค์ค‘ ์ฝ”์–ด ์‚ฌ์šฉ์ด ํž˜๋“ค์–ด์ง€์ž[40] ๋ˆˆ๋ฌผ๊ฒจ์šด ๋งˆ๊ฐœ์กฐ๋ฅผ ๊ฑฐ๋“ญํ•˜์—ฌ ํŒŒ์ด์ฌ์ด๋ผ๋Š” ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ํ•œ๊ณ„์น˜๊นŒ์ง€ ๋ฝ‘์•„์„œ ์“ฐ๊ณ  ์žˆ๋‹ค.
  • NumPy+SciPy+matplotlib ์กฐํ•ฉ์ด ๊ณผํ•™ ๊ณตํ•™ ๊ณ„์‚ฐ์šฉ์œผ๋กœ ์ž์ฃผ ์“ฐ์ธ๋‹ค.
  • 2014๋…„ 6์›” WWDC์—์„œ ์• ํ”Œ์ด ๊ณต๊ฐœํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Swift๋ณด๋‹ค 220๋ฐฐ ๋А๋ฆฌ๋‹ค๊ณ  ๊นŒ์˜€๋‹ค. ์œ ์ €๋“ค์€ C ๋ฐ”์ธ๋”ฉ์ธ ctypes๋ฅผ ์ถœ๋™ ์‹œํ‚จ๋‹ค๊ณ  ๋ถ€๋“ค๋ถ€๋“ค... ํ•˜์ง€๋งŒ JIT ์—†๋Š” ๋™์  ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์™€ ์ปดํŒŒ์ผ ์–ธ์–ด์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๋ฉด ์–ด๋–ค ์–ธ์–ด๋ฅผ ๋น„๊ตํ•˜๋”๋ผ๋„ ๋‹น์—ฐํžˆ ํ›„์ž๊ฐ€ ์••๋„์ ์œผ๋กœ ์œ ๋ฆฌํ•˜๋‹ค๋Š” ์ ์—์„œ ์ด๊ฑด ๋น„๊ต ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์•”ํ˜ธํ™” ๊ฐ™์€ CPU heavyํ•œ ์ž‘์—…์€ ๋ณดํ†ต ๋‹ค C๋กœ ์งœ์„œ ๋ถ™์ธ๋‹ค. Python ํ•ด์‰ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ hashlib๋งŒ ํ•ด๋„ ์ฝ”์–ด๊ฐ€ ์ „๋ถ€ C๋กœ ๋˜์–ด์žˆ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šธ ๋•Œ ์ถ”์ฒœํ•  ๋งŒํ•œ ์–ธ์–ด์ด๋‹ค. ๋งŽ์€ ๋Œ€ํ•™๋“ค์ด C++ ํ™˜๊ฒฝ์—์„œ OOP๋ฅผ ๊ฐ€๋ฅด์น˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋Š” ์‹ค์Šต์ด ๋งŽ์€๋ฐ ๋Œ€๋ถ€๋ถ„ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ด๋‹ค๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. STL์„ ์“ฐ๋ฉด ๋‹ฌ๋ผ์ง€์ง€๋งŒ ์‹ค์Šต์—์„œ STL์„ ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋„ ๋“œ๋ฌผ๊ณ , ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž์—ด ๋ณ€ํ™˜, ๋ฐฐ์—ด ๊ด€๋ จ ์—ฐ์‚ฐ ๋“ฑ์€ ํŒŒ์ด์ฌ์—์„œ ๋”ฐ๋กœ ์ž„ํฌํŠธํ•  ํ•„์š” ์—†์ด ์ž๋ฃŒํ˜• ์ž์ฒด๊ฐ€ ์ด๋ฏธ ํด๋ž˜์Šค๋กœ์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ํด๋ž˜์Šค ํ•จ์ˆ˜๋ฅผ ๋˜์ ธ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ž˜์Šค์˜ ์žฌํ™œ์šฉ์ด๋ผ๋Š” ์ธก๋ฉด์„ ํ›จ์”ฌ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ํ•˜๋ฃจ๋ฉด ๋‹ค ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์ด๊ธฐ๋„ ํ•˜๊ณ . ๋‹ค๋งŒ ๋Œ€ํ•™๋“ค๋„ ์•„๋ฌด๋Ÿฐ ์ด์œ  ์—†์ด C++์„ ๊ฐ์ฒด ์ง€ํ–ฅ ์ž…๋ฌธ์šฉ์œผ๋กœ ์ฑ„ํƒํ•œ ๊ฑด ์•„๋‹ˆ๋‹ค. ๋งŽ์€ ํ•™์ƒ๋“ค์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ค‘ C๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ๋ฐฐ์šฐ๊ธฐ์—, C++์€ ๊ทธ๋‚˜๋งˆ ์ต์ˆ™ํ•œ ๊ฐœ๋…๋“ค์„ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด ์ง€ํ–ฅ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๋ฌผ๋ก  C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ ์–ด๋„ "C์–ธ์–ด์˜ ๊ตฌ์กฐ์ฒด ์•ˆ์— ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด C++์ด๋‹ค"๋Š” ์‹์˜ ๋‚š์‹œ๋กœ ํ•™์ƒ๋“ค์—๊ฒŒ ์‹ฌ๋ฆฌ์  ํŽธ์•ˆํ•จ์„ ์ค„ ์ˆ˜๋Š” ์žˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ž…๋ฌธ์šฉ ์–ธ์–ด๋กœ C++๋ณด๋‹ค ํŒŒ์ด์ฌ์„ ๋จผ์ € ๊ฐ€๋ฅด์น˜๋Š” ๋Œ€ํ•™๋„ ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ถ”์„ธ๋ผ, ํŒŒ์ด์ฌ๋ถ€ํ„ฐ ๋จผ์ € ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค.
    • Fluent Python(๋ฒˆ์—ญ์„œ: ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ ํŒŒ์ด์ฌ)์ด๋ผ๋Š” ์ฑ…์ด ์žˆ๋‹ค.
  • 2014๋…„ 8์›” 30์ผ, ์œ ์„œ๊นŠ์€ ํŒŒ์ด์ฌํ–‰์‚ฌ์ธ PyCon์ด ๋“œ๋””์–ด ํ•œ๊ตญ์—์„œ๋„ ์„ฑ๊ณต๋ฆฌ์— ๊ฐœ์ตœ๋˜์—ˆ๋‹ค. #๊ณต์‹ํ™ˆํŽ˜์ด์ง€
    2015๋…„ 8์›” 29์ผ, PyCon 2015๊ฐ€ ์ƒ์•” ๋ˆ„๋ฆฌ๊ฟˆ์Šคํ€˜์–ด์—์„œ ์•ฝ 700๋ช…์˜ ๊ทœ๋ชจ๋กœ ๊ฐœ์ตœ๋˜์—ˆ๋‹ค. #๊ณต์‹ํ™ˆํŽ˜์ด์ง€
    2016๋…„์—๋Š” PyCon APAC๊ฐ€ ํ•œ๊ตญ์—์„œ[41] ์„ฑ๊ณต๋ฆฌ์— ๊ฐœ์ตœ๋˜์—ˆ๋‹ค.#๊ณต์‹ํ™ˆํŽ˜์ด์ง€
    2017๋…„์—๋Š” PyCon.KR 2017(ํŒŒ์ด์ฝ˜ ํ•œ๊ตญ 2017)์ด ๊ฐ•๋‚จ ์ฝ”์—‘์Šค์—์„œ ์—ด๋ ธ๋‹ค(8.12~15).
    2018๋…„์—๋Š” PyCon.KR์— ์ฐธ๊ฐ€ํ•œ IntelliJ IDEA๋กœ ์œ ๋ช…ํ•œ JetBrains์˜ PyCharm ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆ์ €์ธ Dmitry Trofimov๊ฐ€ ํ–‰์‚ฌ๋ฅผ ๋ณด๊ณ  PyCharm ํ•œ๊ธ€ํ™” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒˆ์—ญ์ด 20% ์ •๋„ ๋˜๊ณ  ์ˆ˜ ๋…„์งธ ๋ฉˆ์ถฐ ์žˆ๋Š” ์ƒํƒœ...๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ ๊ธฐ์—ฌํ•ด ๋ณด์ž. ๋‹ค๋งŒ ๊ฐœ๋ฐœ์ž๋“ค์€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ ์˜์–ด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ผ ๊ธฐ์—ฌ๋ฅผ ํ•  ์‚ฌ๋žŒ์ด ์žˆ์„์ง€๋Š” ์˜๋ฌธ์ด๋‹ค.
  • 2015๋…„ 7์›” 9์ผ "๊ฐ™์ด ๋ฒˆ์—ญํ•ด์„œ ๊ฐ™์ด ๋ด…์‹œ๋‹ค"๋ผ๋Š” ํ‘œ์–ด๋ฅผ ๋‚ด๊ฑธ๊ณ  ํŒŒ์ด์ฌ ๋ฌธ์„œ๋ฅผ ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ๊ฒผ๋‹ค. flowdas / ํŒŒ์ด์ฌ ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ
  • ๋„๋„๋“œ ๊ธ€๋กœ๋ฒ„๊ฐ€ ์ž์‹ ์˜ ๋…ธ๋ž˜ ๊ฐ€์‚ฌ์— Python์„ ๋ฐฐ์šฐ๋ผ๋Š” ๊ฐ€์‚ฌ๋ฅผ ๋„ฃ๊ธฐ๋„ ํ–ˆ๋‹ค.
  • ๊ท€๋„ ๋ฐ˜ ๋กœ์„ฌ์€ 2019๋…„ 10์›” 30์ผ๋ถ€๋กœ ๋“œ๋ž๋ฐ•์Šค์—์„œ ๋‚˜์˜ค๊ณ  ์€ํ‡ดํ•˜์˜€๋‹ค.
  • 3.5๋ถ€ํ„ฐ๋Š” XP๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํˆฌ์–ด๋ผ์ด๋ธŒ ์˜ ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ ์˜ ๋Œ€๋ถ€๋ถ„์€ ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.
  • 2020๋…„ 5์›”, 3.9๋ถ€ํ„ฐ๋Š” ๋น„์Šคํƒ€์™€ 7์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
[1] Python์˜ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„์™€ ์ƒ์‚ฐ์„ฑ์„ ๋‘๊ณ  ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์œ ํ–‰์ฒ˜๋Ÿผ ํผ์ง„ ๋ง์ด๋‹ค.
[2] ์—ฌ๊ธฐ์—์„œ ์“ฐ๋Š” ๋ฒ„์ „์€ 3.8.2์ด๋‹ค
[3] ์›๋ฌธ์—๋Š” "๋„ค๋œ๋ž€๋“œ์ธ์ด ์•„๋‹Œ ์ด์ƒ" ์ด๋ผ๋Š” ๋†๋‹ด์กฐ์˜ ์กฐ๊ฑด์ด ๋ถ™๋Š”๋ฐ, ์•„๋งˆ๋„ ํŒŒ์ด์ฌ์˜ ์ฐฝ์‹œ์ž์ธ ๊ท€๋„ ๋ฐ˜ ๋กœ์„ฌ์„ ๋‘๊ณ  ํ•˜๋Š” ์–˜๊ธฐ๋กœ ๋ณด์ธ๋‹ค.
[4] ๋Œ€๋ถ€๋ถ„ IDE๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ 1๊ฐœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ์ž๋™์œผ๋กœ ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.
[5] Python์˜ ํ˜•์ œ ์–ธ์–ด๋ผ ๋ถˆ๋ฆฌ๋Š” Ruby๋Š” ๋ธ”๋ก์˜ ๋์„ end ํ‚ค์›Œ๋“œ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฌธ์ œ์—์„œ๋Š” ์ž์œ ๋กœ์šด ํŽธ์ด๋‹ค.
[6] ํŠœํ”Œ์„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ง‰๋Š” ์ด์œ ๋Š” ๋ณด์•ˆ ๋•Œ๋ฌธ์ด๋‹ค.
[7] global์ด๋‚˜ nonlocal ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ
[8] return ๋Œ€์‹  yield๋ฅผ ์จ์„œ ์ƒ์„ฑ๊ธฐ(generator)๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ.
[9] ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ฒฝ์šฐ 64๋น„ํŠธ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๋งค์šฐ ํฐ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Java์˜ BigInteger, JavaScript์˜ BigInt์™€ ๊ฐ™์ด ๋ณ„๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
[10] ํฐ ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜๋“ค์„ Python 2๋ถ€ํ„ฐ ์ €์žฅํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„ ํฐ ์ˆ˜ ํ™œ์šฉ ๋ถ€๋ถ„์€ Python 2์™€ 3๊ฐ€ ํ˜ธํ™˜์ด ์•ˆ ๋˜๋Š” ์ง€์  ์ค‘ ํ•˜๋‚˜๋‹ค. ๋‚ด์žฅํ•จ์ˆ˜ ๋ช‡๋ช‡์ด 2์™€ 3์—์„œ ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅด๋‹ค.
[11] Python 3.5์—์„œ ์ถ”๊ฐ€๋œ typing ๋ชจ๋“ˆ์—์„œ๋„ ๊ธธ์ด๊ฐ€ ๊ฐ€๋ณ€์ ์ธ tuple์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
[12] MATLAB์˜ GUI ๊ธฐ๋ฐ˜ ๋ชจ๋ธ๋ง ํˆด๋ฐ•์Šค์ธ Simulink๋Š” ๊ธฐ์—…์šฉ์œผ๋กœ ๊ตฌ๋งคํ•˜๋ฉด ๊ธฐ๋ณธ toolbox๊ฐ€ 1 copy์— ์ฒœ๋งŒ ์› ๋‹จ์œ„, ๊ฐ์ข… ์ „๊ธฐ, ์ „์ž, ๊ธฐ๊ณ„, ์œ ์••, ํ•ญ๊ณต ๋“ฑ์— ๊ด€๋ จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ถ”๊ฐ€๋กœ ์œ ๋ฃŒ๋กœ ํŒ๋งคํ•œ๋‹ค. ๊ฑฐ๊ธฐ์— C๋กœ ํฌํŒ… ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ๋„ ์—ญ์‹œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ถ”๊ฐ€ ๊ตฌ๋งคํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์˜คํ”ˆ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋กœ Simulink๋ฅผ ๋Œ€์ฒดํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ํ˜„์žฌ๋กœ์„œ๋Š” FMI ๊ธฐ๋Šฅ ๋ฐ C ์ฝ”๋“œ๋กœ์˜ ์˜คํ† ์ฝ”๋”ฉ ๋ชจ๋“ˆ์ด ์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ์ฐธ ๋”๋Ÿฝ๊ฒŒ ์ด์ƒํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋†จ๋‹ค. MATLAB๊ณผ ๊ฐ™์€ ๋ชฉ์ ์˜ Python ํŒจํ‚ค์ง€์ธ NumPy๋Š” ๋ชจ์ข…์˜ ๊ณ„์•ฝ์„ ํ†ตํ•ด ๋ฌธ๋ฒ•๊ณผ ํ•จ์ˆ˜ ๋“ฑ์˜ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ MATLAB ํ•จ์ˆ˜์™€ ํ˜ธํ™˜๋˜๊ฒŒ ์ˆ˜์ •ํ•ด ๋ฒ„๋ ธ๊ณ , ์•ˆ ๊ทธ๋ž˜๋„ ๊ฝค ์“ฐ์˜€๋˜ NumPy๋Š” ๋”์šฑ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๋‹ค. Python์˜ ๊ฒฝ์šฐ๋Š” ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋Œ€๋ถ€๋ถ„์ด ์˜คํ”ˆ์†Œ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ์†Œ์—์„œ ๊ทธ๋ƒฅ ์ปค๋งจ๋“œ ๋ผ์ธ(pip install ํŒจํ‚ค์ง€) ํ•œ ์ค„๋กœ ํ•„์š”ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
[13] ์›๋ž˜ ์–ธ์–ด ์ชฝ์—์„œ Multilingual๊ณผ ๊ฐ™์€ ๋œป์œผ๋กœ ์“ฐ์ด๋‚˜, ์ปดํ“จํ„ฐ, IT ์—…๊ณ„์—์„œ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ๊ตฌ์‚ฌํ•˜์—ฌ ์ ์žฌ์ ์†Œ์— ์ž˜ ์กฐํ•ฉํ•˜์—ฌ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๋œปํ•œ๋‹ค.
[14] ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์ผ๋‹จ ํด๋ž˜์Šค ์•ˆ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ „์—ญ ํ•จ์ˆ˜๋Š” static ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ์งœ์•ผ ํ•œ๋‹ค.
[15] Beazley์˜ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋” ๋งŽ์€ ์‹œ๊ฐ ์ž๋ฃŒ์™€ ์˜์ƒ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
[16] ์‚ฌ์‹ค GIL ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค ๋‹น์‹œ ์‹ฑ๊ธ€์ฝ”์–ด๊ฐ€ ์ผ๋ฐ˜์ ์ด์—ˆ๋‹ค๋Š” ๊ฑธ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‹ฑ๊ธ€์ฝ”์–ด์—์„œ์˜ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ ๋ชฉ์  ์ž์ฒด๊ฐ€ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ๋ณด๋‹ค๋Š” ์ด๋Ÿฐ ๋‹ค์ค‘ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ตฌํ˜„์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋Ÿฐ ๊ด€์ ์—์„œ๋Š” GIL์ด ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด์—ˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
[17] ๋‹จ, ์ฝ”๋ฃจํ‹ด์ด๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์ด๋Ÿฐ ์ตœ๊ทผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ฒ˜์Œ์œผ๋กœ ๋“ฑ์žฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด์˜ ๊ฐœ๋…์€ 1950๋…„๋Œ€์— ์ด๋ฏธ ๋‚˜์™”๋‹ค.
[18] JavaScript์˜ npm์ด #npm init์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค.
[19] ๋ฐ˜๋Œ€๋กœ B๋ถ€ํ„ฐ ์„ค์น˜ํ•œ ๋‹ค์Œ A๋ฅผ ์„ค์น˜ํ•˜๋ฉด B๊ฐ€ ์“ธ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.
[20] ๋ณต์žกํ•œ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ์—ฌ๋Ÿฌ OS ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ๋„ ์žˆ์ง€๋งŒ, C์™€ C++ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์–ธ์–ด๋Š” ํ•ด๋‹น OS์— ๋งž๊ฒŒ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ˆ˜๋งŽ์€ OS์— ๋งž์ถฐ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
[21] ๊ฐ€๋ น ๋‚ด๊ฐ€ ๋งŒ๋“  ํŒจํ‚ค์ง€ A๊ฐ€ B์— ์˜์กดํ•˜๊ณ , B๋Š” C์— ์˜์กดํ•  ๊ฒฝ์šฐ, ์˜ˆ์ „์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ A, B, C๋ฅผ ์ผ์ผ์ด ์„ค์น˜ํ•ด์•ผ ํ–ˆ๋‹ค.
[22] setuptools๋‚˜ ์„ค์น˜์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ. ๋˜ํ•œ C/C++ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์‹œ์Šคํ…œ์— C/C++ ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
[23] npm์ด ์‚ฌ์šฉํ•˜๋Š” package.json๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, TOML์ด๋ผ๋Š” ํŒŒ์ผ ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
[24] C ์‹œ๊ฐ„์— ์Šคํƒ ์˜์—ญ ํž™ ์˜์—ญ ํ•  ๋•Œ ๋‚˜์˜ค๋Š” ๊ทธ ์Šคํƒ์ด๋‹ค.
[25] C ๋ ˆ๋ฒจ์—์„œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์Šคํƒ์ด๋ผ "C๋กœ ์งœ์—ฌ์ง„ ํ”„๋กœ๊ทธ๋žจ"์ธ CPython์€ ์†์„ ๋Œˆ ์ˆ˜๊ฐ€ ์—†๋‹ค. ์›์น™์ ์œผ๋กœ๋Š” ๋ง์ด์ง€
[27] ๋ฉ”๋ชจ๋ฆฌ์˜ ์šฉ๋Ÿ‰์ด ์œ ํ•œํ•œ ์ด์ƒ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์—๋Ÿฌ๊ฐ€ ์•ˆ ๋‚  ์ˆ˜๋Š” ์—†๋‹ค.
[28] OS๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ, ์œ ์ € ํ”„๋กœ์„ธ์Šค ์ฐจ์›์—์„œ ์ง์ ‘ ๋Œ๋ฆฌ๋Š” ์“ฐ๋ ˆ๋“œ. ๊ทธ๋ฆฐ ์“ฐ๋ ˆ๋“œ(green thread)๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ Ruby 1.8๊นŒ์ง€ ์ง€์›ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค.
[29] PyCharm ํ”„๋กœํŽ˜์…”๋„์€ ๋Œ€ํ•™์ƒํ•œํ…Œ๋Š” ๋ฌด๋ฃŒ์ด๋‹ค
[30] ํ„ฐ๋ฏธ๋„ ๊ธฐ๋ฐ˜์˜ ๋…ธํŠธ๋ถ ํ™˜๊ฒฝ ์ธํ„ฐํ”„๋ฆฌํ„ฐ. ๊ธฐ์กด์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ ๊ตฌ๋ถ„๋˜๋Š” UI๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ์€ ipython์ด ์›น๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ
[31] ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ์‹คํ–‰๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ณ„ํ‘œ๋งŒ ๋„์šฐ๋Š” ์ผ์ด ์ข…์ข… ์žˆ๋‹ค. ์ด๊ฒŒ ๊ฑธ๋ ค๋ฒ„๋ฆฌ๋ฉด ๊ธฐ์กด์— ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ณ„ํ‘œ๋งŒ ๋‚˜์˜จ๋‹ค. ๋ณดํ†ต ์ž…๋ฌธ์ž๋“ค์ด ์ฝ”๋“œ๋ฅผ ์ด์ƒํ•˜๊ฒŒ ์งœ๋ฉด ์ €๋ฆฌ ๋˜๋Š”๋ฐ, ์‹ ๊ธฐํ•œ ๊ฑด ์—๋Ÿฌ๋„ ์•ˆ ๋ฟœ๊ณ  ๋ณ„ํ‘œ๋งŒ ๋„์šฐ๊ณ  ๋ป—์–ด๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฑฐ๋‹ค. ์ปค๋„์„ ๋ฆฌ์…‹ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๊ธด ํ•˜๋Š”๋ฐ ๋จธ์ง€์•Š์•„ ๋˜ ๋ป—๊ธฐ๋„ ํ•œ๋‹ค. ๋ฐ‘์— ์žˆ๋Š” ๊ตฌ๊ธ€ ์ฝœ๋ผ๋ณด๋Š” ์ด๊ฒŒ ์ข€ ๋œํ•œ ํŽธ.
[32] ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ์˜ ์ƒ์œ„ํ˜ธํ™˜ ๋ฒ„์ „. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ€๋ถ„์ด ๋…ธํŠธ๋ถ์— ๋น„ํ•ด ๊ฐœ์„ ๋˜์–ด ๋” ๊น”๋”ํ•ด์กŒ๋‹ค. ํ…Œ๋งˆ๋‚˜ ํ„ฐ๋ฏธ๋„ ์„ค์ •๋„ ๊ฐ€๋Šฅํ•ด ๋ˆˆ์ด ํŽธํ•˜๋‹ค. ์ด์ „์˜ ๋…ธํŠธ๋ถ์„ ๋” ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋Š” ํŽธ.
[33] ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ ํ™˜๊ฒฝ์œผ๋กœ. ๋ณ„๋„์˜ ์„ค์น˜๊ฐ€ ์ „ํ˜€ ํ•„์š”์—†๋‹ค. ์‹ฌ์ง€์–ด ํœด๋Œ€ํฐ์—์„œ๋„ ๋Œ์•„๊ฐ„๋‹ค! ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹Œ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œํ’€์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ฒซ ์‹คํ–‰์˜ ๊ฒฝ์šฐ ์‹คํ–‰์†๋„๊ฐ€ ๋‹ค์†Œ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์—์„œ ์ฒ ์ €ํ•˜๊ฒŒ ์›น ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š”์ง€๋ผ ๋ณธ์ธ ์ปดํ“จํ„ฐ์— ์—†๋Š” ๋ชจ๋“ˆ๋„ ์ฆ‰์„์—์„œ ๋ฐ›์•„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ๋“ค์–ด์ง„ ๋…ธํŠธ ํŒŒ์ผ์€ ๋ณธ์ธ์˜ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ์— ์ €์žฅ๋œ๋‹ค.
[34] ๋‹จ, Conda์—๋Š” ๋“ฑ๋ก๋˜์ง€ ์•Š์•„์„œ Pip์œผ๋กœ๋งŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ด Pip์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
[35] ๋‹จ, ํ—ˆ์šฉํ•  ๋ฟ์ด์ง€ ํŒŒ์ด์ฌ์ด ์Šค์Šค๋กœ ์ž๋ฃŒํ˜•์„ ๊ฒ€์‚ฌํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. Type hint๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์ฝ๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„์ด๋‹ค.
[36] PySide2๋ฅผ Qt for Python์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.
[37] ํ•˜๋“œ์›จ์–ด์ธ ์„œ๋ฒ„ ์ปดํ“จํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ทธ ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์›น ์„œ๋ฒ„๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ฐ›์•„ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ๋„˜๊ฒจ์ฃผ๋ฉฐ, ์†Œ์ผ“์ด๋‚˜ ํ”„๋กœ์„ธ์Šค ํ’€๊ณผ ๊ฐ™์€ ์ž์›์„ ๊ด€๋ฆฌํ•œ๋‹ค.
[38] ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค๋Š” ๋™์‹œ์— 5์–ต ์› ์ด์ƒ์˜ ๋งค๋งค๋ฅผ ๋‚ด๋Š” ๊ฑฐ๋ž˜๋กœ, ์›๋ž˜๋Š” ํ•œ๊ตญ์˜ˆํƒ๊ฒฐ์ œ์›์˜ ์Šน์ธ์„ ๋ฐ›์€ ๊ธฐ๊ด€ ํˆฌ์ž์ž๋‚˜ ์™ธ๊ตญ์ธ ํˆฌ์ž์ž๋งŒ ์‚ฌ์ „์— ์˜ˆํƒ๊ฒฐ์ œ์›์— ํ”„๋กœ๊ทธ๋žจ์„ ๋“ฑ๋กํ•˜๊ณ  ๋งค๋งคํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋™์‹œ์— 5์–ต์› ๋ฏธ๋งŒ์˜ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋Š” ๊ฐœ์ธํˆฌ์ž์ž๋“ค๊นŒ์ง€ ์˜ˆํƒ๊ฒฐ์ œ์›์ด ๊ฐ„์„ญํ•˜๊ธฐ๋Š” ๋ญํ–ˆ๋Š”์ง€ ์ด์ชฝ์€ ๊ทœ์ œ ์‚ฌ๊ฐ์ง€๋Œ€๋‹ค.
[39] ์ผ๋ณธ์€ Ruby๊ฐ€ ๋Œ€์„ธ๋ผ์„œ, Ruby๋กœ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠธ๋ ˆ์ด๋”ฉ์ด ๋งŽ๋‹ค. Ruby๋กœ ๋งŒ๋“  ํŠธ๋ ˆ์ด๋”ฉ ํˆด์€ Python๊ณผ ๋น„์Šทํ•œ ํผํฌ๋จผ์Šค๊ฐ€ ๋‚œ๋‹ค.
[40] ์ „์žฅ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์‹œ์‹œ์ฝœ์ฝœํ•œ ์ผ์„ ๋‹ค๋ฅธ ์ฝ”์–ด๋กœ ๋Œ๋ฆฌ๊ธฐ๋Š” ํ•˜์˜€์œผ๋‚˜, ๊ฒŒ์ž„์˜ ์ตœ์†Œ ๋‹จ์œ„์ธ ์ „์žฅ์€ ๊ตฌ์กฐ์ƒ์˜ ํ•œ๊ณ„๋กœ ํ•˜๋‚˜์˜ ์ฝ”์–ด๋งŒ ๋™์›ํ•  ์ˆ˜ ์žˆ๋‹ค.
[41] ๊ฐ•๋‚จ ์ฝ”์—‘์Šค์—์„œ 13~14์ผ ์•„์นด๋งˆ์ด์—์„œ 15์ผ(ํŠœํ† ๋ฆฌ์–ผ).