๐Ÿ“š Part 1. Python์˜ ํ•ต์‹ฌ ๊ตฌ์กฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”

1. ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ (AI ์‹œ๋Œ€, ์™œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š”๊ฐ€?)

๐Ÿค– ๋ณ€ํ™”ํ•˜๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • AI Coding Agent์˜ ๋ฐœ์ „: Claude, Cursor, Copilot ๋“ฑ AI์˜ ์ฝ”๋“œ ์ž‘์„ฑ ๋Šฅ๋ ฅ์€ ์ด๋ฏธ ์‹œ๋‹ˆ์–ด ์—”์ง€๋‹ˆ์–ด ์ˆ˜์ค€์— ๋„๋‹ฌํ•˜๊ณ  ์žˆ์Œ.
  • ์—ญํ• ์˜ ๋ณ€ํ™”:
    • ์‚ฌ๋žŒ (Architect): ์ผ์„ ์ง€์‹œํ•˜๊ณ , ์„ค๊ณ„๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฌผ์„ ํ‰๊ฐ€ํ•˜๋Š” ์ฑ…์ž„์ž.
    • AI (Developer/Supporter): ์ง€์‹œ๋ฐ›์€ ๋‚ด์šฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž.

๐Ÿ“š ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ํ•™์Šตํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

๋‹จ์ˆœ ๋ฌธ๋ฒ• ์•”๊ธฐ๋ณด๋‹ค๋Š” ์ „๋žต์  ์‚ฌ๊ณ ์™€ ์ „์ฒด ๊ตฌ์กฐ ์ดํ•ด๊ฐ€ ์ค‘์š”ํ•ด์ง.

  1. ํ‰๊ฐ€ ๋ฐ ์ง€์‹œ ๋Šฅ๋ ฅ: AI๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ๋ฐฉํ–ฅ์„ฑ์ด ๋งž๋Š”์ง€, ์ž ์žฌ์  ๋ฌธ์ œ๋Š” ์—†๋Š”์ง€ ํ‰๊ฐ€(Audit)ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์‹์ด ํ•„์ˆ˜.
  2. ์‹œ์Šคํ…œ ๋””์ž์ธ & ์•„ํ‚คํ…์ฒ˜: ์ฝ”๋“œ ๋ผ์ธ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ, ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐํฌ, ์šด์˜, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ Trade-off๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฑฐ์‹œ์  ๊ด€์  ํ•„์š”.
  3. Communication: ๋ชจํ˜ธํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜๊ณ  ํ˜‘์—…ํ•˜๋Š” ๋Šฅ๋ ฅ์€ AI๊ฐ€ ๋Œ€์ฒดํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ.
  4. ํ•œ ์–ธ์–ด์˜ ๊นŠ์ด ์žˆ๋Š” ์ดํ•ด: ํ•˜๋‚˜์˜ ์–ธ์–ด๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ๋„ ์‰ฝ๊ฒŒ ์Šต๋“ ๊ฐ€๋Šฅ.

2. Python์˜ ํŠน์ง•

โœ… ์žฅ์ 

  • ์ง๊ด€์ ์ธ ๋ฌธ๋ฒ•: ์ธ๊ฐ„ ์นœํ™”์ ์ด๋ฉฐ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‰ฌ์›€.
  • ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„: AI/๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์•ผ์˜ ์••๋„์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ํŒจํ‚ค์ง€) ์ง€์›.
  • Interpreter ์–ธ์–ด (REPL ํ™˜๊ฒฝ):
    • ์ฝ”๋“œ ์‹คํ–‰ ์ „ ์ปดํŒŒ์ผ ๊ณผ์ • ์—†์ด ์ฆ‰์‹œ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ ๊ฐ€๋Šฅ.
    • ์•„์ด๋””์–ด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ค์ˆ˜๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด ์ƒ์‚ฐ์„ฑ(Productivity)์ด ๋งค์šฐ ๋†’์Œ.

โš ๏ธ ๋‹จ์ 

  • ๋А๋ฆฐ ์‹คํ–‰ ์†๋„: ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์˜ ํ•œ๊ณ„.
  • ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด(Object)๋กœ ๊ด€๋ฆฌ๋จ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ.
  • GIL (Global Interpreter Lock): ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ํšจ์œจ ์ €ํ•˜.
  • Runtime Error: ์‹คํ–‰ ์ „์—๋Š” ํƒ€์ž… ์—๋Ÿฌ ๋“ฑ์„ ์žก๊ธฐ ์–ด๋ ค์›€.

3. Python Memory Allocation (๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น)

3.1 ๐Ÿง  ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด์˜ ๊ด€๊ณ„

  • Python์—์„œ ๋ณ€์ˆ˜(Variable)๋Š” ๊ฐ์ฒด(Object)์— ๋ฌถ์—ฌ ์žˆ๋Š” ์ด๋ฆ„(Name)์— ๋ถˆ๊ณผํ•จ.
  • ์‹ค์ œ ๊ฐ’(Object)์€ Heap ์˜์—ญ์— ํ• ๋‹น๋จ.
  • C์–ธ์–ด์™€์˜ ์ฐจ์ด:
    • C: ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ Stack์— ๊ฐ’์ด ์ง์ ‘ ํ• ๋‹น๋จ (๋น ๋ฆ„).
    • Python: ๋ณ€์ˆ˜ ์ด๋ฆ„์€ Stack์—, ์‹ค์ œ ๊ฐ์ฒด๋Š” Heap์— ์ƒ์„ฑ๋˜๊ณ  ์ด๋ฅผ ์ฐธ์กฐ(Reference)ํ•˜๋Š” ๊ตฌ์กฐ (์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ).

3.2 ๐Ÿ—๏ธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (Memory Layout)

๋ฉ”๋ชจ๋ฆฌ๋Š” ํšจ์œจ์ ์ธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์˜์—ญ์ด ๋‚˜๋‰˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ(RAM) ์ƒ์—์„œ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ์˜ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ฃผ์†Œ ์œ„์น˜์˜์—ญ ์ด๋ฆ„์„ค๋ช… ๋ฐ ํŒŒ์ด์ฌ์—์„œ์˜ ์—ญํ• ํŠน์ง•
High Address
(๋†’์€ ์ฃผ์†Œ)
Stack
(์Šคํƒ)
ํ•จ์ˆ˜ ํ˜ธ์ถœ(Call Frame)๊ณผ ๋ณ€์ˆ˜ ์ด๋ฆ„(Name) ์ €์žฅโ€ข ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋˜๊ณ  ๋๋‚˜๋ฉด ์‚ญ์ œ๋จ
โ€ข ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ(โ†“) ๋‚ด๋ ค๊ฐ€๋ฉฐ ํ• ๋‹น๋จ
โ€ข LIFO (Last In First Out) ๊ตฌ์กฐ
โ†•๏ธ(Free Space)์Šคํƒ๊ณผ ํž™ ์‚ฌ์ด์˜ ๋นˆ ๊ณต๊ฐ„์Šคํƒ์€ ์•„๋ž˜๋กœ, ํž™์€ ์œ„๋กœ ์ž๋ผ๋‚˜๋ฉฐ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•จ
MiddleHeap
(ํž™)
์‹ค์ œ ๊ฐ์ฒด(Object, Value) ์ €์žฅโ€ข ํŒŒ์ด์ฌ์˜ ๋ชจ๋“  ๊ฐ’(int, list, function ๋“ฑ)์€ ์—ฌ๊ธฐ์— ์ €์žฅ๋จ
โ€ข ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์•„๋ž˜์—์„œ ์œ„๋กœ(โ†‘) ์˜ฌ๋ผ๊ฐ€๋ฉฐ ํ• ๋‹น๋จ
โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ (Dynamic Allocation)
Low Address
(๋‚ฎ์€ ์ฃผ์†Œ)
Data
(BSS/Init)
์ „์—ญ ๋ณ€์ˆ˜(Global Variable) ์„ค์ • ์ •๋ณดโ€ข Initialized: ์ดˆ๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ
โ€ข Uninitialized (BSS): ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ
โ€ข ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ํ• ๋‹น๋จ
LowestText
(Code)
์†Œ์Šค ์ฝ”๋“œ (๊ธฐ๊ณ„์–ด)โ€ข ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ
โ€ข ์ฝ๊ธฐ ์ „์šฉ (Read-Only)

3.2.1 Stack๊ณผ Heap์˜ ์„ฑ์žฅ ๋ฐฉํ–ฅ

  • Stack: ๋†’์€ ์ฃผ์†Œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋‚ฎ์€ ์ฃผ์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ผ๋‚ฉ๋‹ˆ๋‹ค. (์œ„์—์„œ ์•„๋ž˜๋กœ โ†“)
  • Heap: ๋‚ฎ์€ ์ฃผ์†Œ(Data ์˜์—ญ ๋ฐ”๋กœ ์œ„)์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋†’์€ ์ฃผ์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ผ๋‚ฉ๋‹ˆ๋‹ค. (์•„๋ž˜์—์„œ ์œ„๋กœ โ†‘)
  • Out of Memory: ์ด ๋‘˜์ด ์„œ๋กœ ์ž๋ผ๋‚˜๋‹ค๊ฐ€ ๋งŒ๋‚˜์„œ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ด์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ค๋ฅ˜(Stack Overflow ๋“ฑ)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

3.2.2 C์–ธ์–ด vs Python์˜ ๊ฒฐ์ •์  ์ฐจ์ด

  • C์–ธ์–ด:
    • int a = 10;์„ ์„ ์–ธํ•˜๋ฉด Stack ์˜์—ญ์— 10์ด๋ผ๋Š” ๊ฐ’์ด ์ง์ ‘ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Python:
    • a = 10์„ ์„ ์–ธํ•˜๋ฉด Stack์—๋Š” a๋ผ๋Š” ์ด๋ฆ„(๋ณ€์ˆ˜)๋งŒ ์ƒ๊น๋‹ˆ๋‹ค.
    • ์‹ค์ œ ๊ฐ’ 10์€ Heap ์˜์—ญ์— ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • Stack์˜ a๊ฐ€ Heap์˜ 10์„ ๊ฐ€๋ฆฌํ‚ค๋Š”(Reference/Binding) ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด:
์ž‘์„ฑํ•˜์‹  ๋…ธํŠธ ๋‚ด์šฉ์ฒ˜๋Ÿผ "๋ณ€์ˆ˜(์ด๋ฆ„)๋Š” Stack์— ์žกํžˆ๊ณ , ์‹ค์งˆ์ ์ธ ๊ฐ’(๊ฐ์ฒด)์€ Heap์— ํ• ๋‹น" ๋˜๋Š” ๊ฒƒ์ด ํŒŒ์ด์ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์€ ๋‹จ์ˆœ ์ •์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•˜๋”๋ผ๋„ C์–ธ์–ด๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ(Overhead)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3.3 ๐Ÿ”’ Immutable vs Mutable

๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  • Immutable (๋ถˆ๋ณ€): int, float, str, tuple
  • Mutable (๊ฐ€๋ณ€): list, dict, set

๐Ÿ’ก ํ€ด์ฆˆ: ํŠœํ”Œ ๋‚ด ๋ฆฌ์ŠคํŠธ ์ˆ˜์ •

t = ('This', 'tuple', ['is', 'immutable', '?'])

# Case 1: ํŠœํ”Œ์˜ ์š”์†Œ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝ ์‹œ๋„
# t[2] = ['a', 'new', 'list']
# -> โŒ TypeError ๋ฐœ์ƒ (ํŠœํ”Œ์€ ๋ถˆ๋ณ€)

# Case 2: ํŠœํ”Œ ๋‚ด๋ถ€์˜ ๊ฐ€๋ณ€ ๊ฐ์ฒด(List)์˜ ๋‚ด์šฉ ๋ณ€๊ฒฝ ์‹œ๋„
t[2][2] = '!'
# -> โญ• ์ •์ƒ ์‹คํ–‰ (๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ€๋ณ€)

ํ•ต์‹ฌ: Tuple์€ ๊ทธ ์•ˆ์˜ ๊ตฌ์„ฑ์š”์†Œ(์ฃผ์†Œ๊ฐ’)๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด(List)๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋ผ๋ฉด ๊ทธ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.


4. Python List vs NumPy Array (์„ฑ๋Šฅ ์ฐจ์ด์˜ ์›์ธ)

๐Ÿข Python List์˜ ๊ตฌ์กฐ

  • ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์— Int, Str, Tuple ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€์ž…์ด ํ˜ผ์žฌ ๊ฐ€๋Šฅ.
  • ์ด๋ฅผ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ(Pointer)๋“ค์˜ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋จ.
  • ์ ‘๊ทผ ๊ณผ์ •: List -> Pointer -> PyObject Head(Type ์ฒดํฌ, Ref Count) -> ์‹ค์ œ ๊ฐ’
  • ๋‹จ์ : ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—ฐ์†์ ์ด์ง€ ์•Š๊ณ (Non-contiguous), ํƒ€์ž… ์ฒดํฌ ๋“ฑ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•ด ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋А๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•จ.

๐Ÿ‡ NumPy Array์˜ ๊ตฌ์กฐ

  • *๋‹จ์ผ ๋ฐ์ดํ„ฐ ํƒ€์ž…(Fix)**๋งŒ ํ—ˆ์šฉ.
  • ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ์†์ (Contiguous)์œผ๋กœ ๋ฐฐ์น˜๋จ.
  • ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ(Head ์ •๋ณด ๋“ฑ) ์—†์ด ๊ฐ’์— ์ง์ ‘ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ.

5. ํ•จ์ˆ˜์˜ ์ธ์ž(Default Argument)์™€ ๊ฐ€๋ณ€ ๊ฐ์ฒด

โš ๏ธ ์ฃผ์˜ํ•  ์ : Default Argument๋Š” ๋ฐ˜๋“œ์‹œ Immutable์„ ์‚ฌ์šฉํ•˜๋ผ

ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ์ธ์ž๊ฐ’(Default Argument)์€ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  ๋•Œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ํ‰๊ฐ€(Evaluation)๋˜๊ณ  ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ list์™€ ๊ฐ™์€ ๊ฐ€๋ณ€ ๊ฐ์ฒด(Mutable Object)๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด, ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์–ด ์˜๋„์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ž˜๋ชป๋œ ์˜ˆ์‹œ:
    def myf(i=list()):  # ํ•จ์ˆ˜ ์ •์˜ ์‹œ list()๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋จ
        i.append('first')
        return i
    
    a = myf()
    b = myf()
    print(a)  # ['first', 'first'] -> a์™€ b๊ฐ€ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•จ
    print(b)  # ['first', 'first']
    print(id(a) == id(b))  # True
  • ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ: None์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ฒ˜๋ฆฌ.
    def myf(i=None):
        if i is None:
            i = list()  # ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ํ• ๋‹น
        i.append('first')
        return i

๐Ÿ” Argument Evaluation (์ธ์ž ํ‰๊ฐ€ ์‹œ์ )

  • ํŒŒ์ด์ฌ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ธ์ž(Argument)๋ฅผ ๋จผ์ € ํ‰๊ฐ€(Evaluation)ํ•œ ํ›„ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊น… ์‹œ ์ฃผ์˜:
    # time.sleep()์ด ์‹คํ–‰๋˜์–ด 3์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„, [0] ์ธ๋ฑ์‹ฑ์„ ํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ๋Š” ๋ฒ„๋ ค์ง
    ['no sleep', time.sleep(1), time.sleep(2)][0]
    • ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋งŒ ์‹คํ–‰ํ•˜๋ ค๋Š” ํ•จ์ˆ˜(debug_log)๋ผ๋„ ์ธ์ž๋กœ ๋„˜๊ธฐ๋Š” ํ•จ์ˆ˜(expensive_func)๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…: if __debug__: ๊ตฌ๋ฌธ์ด๋‚˜ O (Optimize) ์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜ ์‚ฌ์šฉ.

6. ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ (Performance & Memory)

๐Ÿข Laziness (์ง€์—ฐ ํ‰๊ฐ€) vs Eagerness

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์†๋„ ๊ฐ„์˜ Trade-off๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Generator Expression (Laziness):

    sum(x*x for x in range(1_000))
    • ํŠน์ง•: ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑํ•˜์—ฌ sum์— ์ „๋‹ฌ.
    • ์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งค์šฐ ์ ์Œ (์ž„๋ฒ ๋””๋“œ, ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์— ์ ํ•ฉ).
    • ๋‹จ์ : ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹๋ณด๋‹ค ์†๋„๊ฐ€ ์•„์ฃผ ์•ฝ๊ฐ„ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ (Context Switching ๋“ฑ).
  2. List Comprehension (Eagerness):

    sum([x*x for x in range(1_000)])
    • ํŠน์ง•: ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ ํ›„ sum์— ์ „๋‹ฌ.
    • ์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ํ•œ ๋ฒˆ์— ์ผ์–ด๋‚˜ ์†๋„๊ฐ€ ์•ฝ๊ฐ„ ๋น ๋ฆ„ (๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„‰๋„‰ํ•  ๋•Œ ์ ํ•ฉ).
    • ๋‹จ์ : ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•จ.

๐Ÿš€ List์˜ ํšจ์œจ์  ์‚ฌ์šฉ๊ณผ Local ๋ณ€์ˆ˜

  • List ์—ฐ์‚ฐ: pop(0)์€ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์•ž์œผ๋กœ ๋‹น๊ฒจ์•ผ(Shift) ํ•˜๋ฏ€๋กœ O(N) ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (๋งค์šฐ ๋น„ํšจ์œจ์ )
  • Local ๋ณ€์ˆ˜ ์ ‘๊ทผ: ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ ๋ชจ๋“ˆ์˜ ์†์„ฑ(math.sqrt)์„ ๊ณ„์† ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค, ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉ(from math import sqrt ํ˜น์€ sqrt = math.sqrt)ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ‘๊ทผ ์†๋„๊ฐ€ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

7. ๊ณ ๊ธ‰ ๋ฌธ๋ฒ• (Advanced Features): slots, Metaclass, Typing

๐Ÿ’พ __slots__

  • ๊ธฐ๋Šฅ: ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ(Attribute)์˜ ์ด๋ฆ„์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ์ :
    1. __dict__ ์ƒ์„ฑ์„ ๋ง‰์•„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋Œ€ํญ ์ ˆ๊ฐ (๋Œ€๋Ÿ‰์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์œ ์šฉ).
    2. ์ •ํ•ด์ง„ ์†์„ฑ ์™ธ์˜ ๋ณ€์ˆ˜ ์ƒ์„ฑ์„ ๋ง‰์•„ Typo(์˜คํƒ€) ๋ฐฉ์ง€.
  • ๋‹จ์ : ๋™์ ์œผ๋กœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Œ (__dict__๊ฐ€ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ธํ™˜ ์•ˆ ๋  ์ˆ˜ ์žˆ์Œ).

๐Ÿ—๏ธ Metaclass

  • ๊ฐœ์š”: "ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค"์ž…๋‹ˆ๋‹ค. (๊ธฐ๋ณธ ๋ฉ”ํƒ€ํด๋ž˜์Šค๋Š” type)
  • ์šฉ๋„: ํด๋ž˜์Šค ์ƒ์„ฑ ๊ณผ์ •์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜, ํ‘œ์ค€ํ™”๋œ API/๋™์ž‘์„ ๊ฐ•์ œํ•  ๋•Œ ์‚ฌ์šฉ (ORM Framework ๋“ฑ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ).
  • ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž: ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ผ์€ ๋“œ๋ฌด๋‚˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋… ํŒŒ์•… ํ•„์š”.

๐Ÿ“ Typing Hint

  • ๋ฐฐ๊ฒฝ: ํŒŒ์ด์ฌ์€ ๋™์  ํƒ€์ดํ•‘ ์–ธ์–ด๋ผ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์œ„ํ—˜์ด ํผ. 3.5 ๋ฒ„์ „๋ถ€ํ„ฐ Type Hint ๋„์ž….
  • ABC (Abstract Base Class): ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๊ฐ€ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œ (Java์˜ Interface์™€ ์œ ์‚ฌ).
  • Protocol: ๋ช…์‹œ์  ์ƒ์† ์—†์ด ๊ตฌ์กฐ์  ํƒ€์ดํ•‘(Structural Subtyping, Duck Typing)์„ ์ง€์›ํ•˜๋ฉฐ ์ปดํŒŒ์ผ ํƒ€์ž„(์ •์  ๋ถ„์„๊ธฐ)์— ์ฒดํฌ ๊ฐ€๋Šฅ.
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์„ ํƒ: ๋ชฉ์ ์— ๋”ฐ๋ผ TypedDict (Dict), dataclass (Class), NamedTuple (Tuple) ์ค‘ ์ ์ ˆํ•œ ๊ฒƒ์„ ์„ ํƒ.

0๊ฐœ์˜ ๋Œ“๊ธ€