CodeGym /์ž๋ฐ” ์ฝ”์Šค /Python SELF KO /๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„

๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„

Python SELF KO
๋ ˆ๋ฒจ 6 , ๋ ˆ์Šจ 4
์‚ฌ์šฉ ๊ฐ€๋Šฅ

10.1 ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜

Python์—์„œ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๊ทธ ์Šค์ฝ”ํ”„์˜ ๋๊นŒ์ง€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด. ๋ณดํ†ต ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ•จ์ˆ˜๊ฐ€ ์Šค์ฝ”ํ”„๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ๋งŒ์•ฝ ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋“  ํ•จ์ˆ˜ ๋ฐ–์— ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, ๊ทธ๊ฑด ์ „์—ญ ๋ณ€์ˆ˜(global variable)๋ผ๊ณ  ๋ถˆ๋ ค.

Python์—์„œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•ด. ์Šค์ฝ”ํ”„๋Š” ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ผ. Python์˜ ์ฃผ์š” ์Šค์ฝ”ํ”„ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

์ง€์—ญ ์Šค์ฝ”ํ”„: ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜๋Š” ๊ทธ ํ•จ์ˆ˜์˜ ์ง€์—ญ ์Šค์ฝ”ํ”„์— ์กด์žฌํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด.

๋‚ดํฌ๋œ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„: ๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์•ˆ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ทธ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋Š” ๋‚ดํฌ๋œ ํ•จ์ˆ˜์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด.

์ „์—ญ ์Šค์ฝ”ํ”„: ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋ชจ๋“ˆ ์ˆ˜์ค€์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผ๋˜๊ณ , ๊ฐ™์€ ๋ชจ๋“ˆ์˜ ์–ด๋””์„œ๋“ ์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด.

๋‚ด์žฅ ์Šค์ฝ”ํ”„: ์ด๊ฒƒ์€ ๋ชจ๋“  ๋‚ด์žฅ ๊ฐ์ฒด์™€ ํ•จ์ˆ˜(Python์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๊ฒƒ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด, print()์™€ len())๋ฅผ ํฌํ•จํ•˜๋Š” ํŠน๋ณ„ํ•œ ์Šค์ฝ”ํ”„์•ผ.

LEGB ๊ทœ์น™

Python์€ ๋ณ€์ˆ˜ ํ•ด์„์„ ์œ„ํ•ด LEGB ๊ทœ์น™์„ ์‚ฌ์šฉํ•ด. ์ด ๊ทœ์น™์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š” ์ˆœ์„œ๋ฅผ ์ •์˜ํ•ด:

  • L (Local) โ€” ๋จผ์ € ์ง€์—ญ ์Šค์ฝ”ํ”„์—์„œ ์ฐพ์•„๋ด.
  • E (Enclosed) โ€” ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๋‚ดํฌ๋œ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์—์„œ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ.
  • G (Global) โ€” ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ.
  • B (Built-in) โ€” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚ด์žฅ ์Šค์ฝ”ํ”„์—์„œ.

์‚ฌ์šฉ ์˜ˆ์‹œ


x = "global"  # ์ „์—ญ ๋ณ€์ˆ˜

def outer():
    y = "outer local"  # ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜
    def inner():
        z = "inner local"  # ๋‚ดํฌ๋œ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜
        print(x)  # "global" ์ถœ๋ ฅ
        print(y)  # "outer local" ์ถœ๋ ฅ
        print(z)  # "inner local" ์ถœ๋ ฅ
    inner()

outer()

๋ณ€์ˆ˜ z๋Š” inner() ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด.

๋ณ€์ˆ˜ y๋Š” outer() ํ•จ์ˆ˜ ๋‚ด์™€ ๊ทธ ์•ˆ์— ์„ ์–ธ๋œ ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด.

๋ณ€์ˆ˜ x๋Š” ํ˜„์žฌ ํŒŒ์ผ(๋ชจ๋“ˆ) ์–ด๋””์„œ๋“ ์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด.

10.2 ์ „์—ญ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ธฐ: global x

Python์˜ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ์™ธ๋ถ€ ์Šค์ฝ”ํ”„(ํ˜„์žฌ ์Šค์ฝ”ํ”„๊ฐ€ ๋‚ดํฌ๋œ)์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑฐ์•ผ.

์™ธ๋ถ€ ๋ณ€์ˆ˜์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด, ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์žƒ๊ฒŒ ๋ผ.

์˜ˆ์‹œ:


x = 10

def change_global():
    print(x)  # ์ด๊ฑด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ, x๊ฐ€ ํ• ๋‹น ํ›„์— ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผ๋  ๊ฑฐ๋‹ˆ๊นŒ
    x = 20  # ์—ฌ๊ธฐ์„œ ์ง€์—ญ ๋ณ€์ˆ˜ x๊ฐ€ ์ƒ์„ฑ๋ผ
    print(x)  # 20์„ ์ถœ๋ ฅ (์ง€์—ญ ๋ณ€์ˆ˜ x์— ์ ‘๊ทผ)

change_global()
print(x)  # 10์„ ์ถœ๋ ฅ

์ด ์˜ˆ์‹œ๋Š” UnboundLocalError๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ, ์™œ๋ƒ๋ฉด Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋จผ์ € x = 20 ํ• ๋‹น์„ ๋ณด๊ณ , x๊ฐ€ ์ง€์—ญ ๋ณ€์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฑฐ๋“ . ํ•˜์ง€๋งŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ print(x) ์ค„์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ, ์•„์ง ์ •์˜๋˜์ง€ ์•Š์€ ์ง€์—ญ ๋ณ€์ˆ˜ x๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ˆ˜๋กœ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด.

global ์—ฐ์‚ฐ์ž

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์˜๋„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด, global ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์ด ์—ฐ์‚ฐ์ž๋Š” ๋ณ€๊ฒฝ์ด ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ „์—ญ ๋ณ€์ˆ˜์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•จ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด ์ค˜.

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ global์„ ์‚ฌ์šฉํ•ด ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜์— ์“ฐ๊ธฐ ์ ‘๊ทผ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ ๋ผ:


x = 10

def change_global():
    global x  # x๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ
    print(x)  # 10์„ ์ถœ๋ ฅ (์ „์—ญ ๋ณ€์ˆ˜ x์— ์ ‘๊ทผ)
    x = 20  # ์ „์—ญ ๋ณ€์ˆ˜ x์— ์ƒˆ ๊ฐ’ ํ• ๋‹น
    print(x)  # 20์„ ์ถœ๋ ฅ (์ „์—ญ ๋ณ€์ˆ˜ x์— ์ ‘๊ทผ)

change_global()
print(x)  # 20์„ ์ถœ๋ ฅ

global ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ณ  ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ œ๋Œ€๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.

์ „์—ญ ๋ณ€์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด, ์™œ๋ƒ๋ฉด ํ”„๋กœ๊ทธ๋žจ ์–ด๋””์„œ๋“  ๊ทธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ํŠนํžˆ ํ”„๋กœ๊ทธ๋žจ์ด ํฌ๊ณ  ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•จ๊ป˜ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ํŠนํžˆ ๊ทธ๋ ‡์ง€.

๊ฐ€๋” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€ํ”ผํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ทธ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ด. ์ „์—ญ ๋ณ€์ˆ˜ ๋Œ€์‹ , ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ด.

์ „์—ญ ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ถ€์ž‘์šฉ์„ ์ดˆ๋ž˜ํ•˜๊ณ , ์ฝ”๋“œ์˜ ๋””๋ฒ„๊น…๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋ ต๊ฒŒ ํ•˜๋ฉฐ, ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ž˜์„œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์žฅํ•ด.

10.3 ๋น„-์ง€์—ญ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ธฐ: nonlocal

์ „์—ญ ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜ ์™ธ์—๋„, Python์—๋Š” ์ค‘๊ฐ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์•ˆ์— ๋‚ดํฌ๋˜์–ด ์žˆ์„ ๋•Œ. ์ด๋Ÿฐ ๋ณ€์ˆ˜๋“ค๊ณผ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด nonlocal ์—ฐ์‚ฐ์ž๊ฐ€ ์‚ฌ์šฉ๋ผ.

nonlocal ์—ฐ์‚ฐ์ž๋Š” ๋‚ดํฌ๋œ ํ•จ์ˆ˜์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด.

nonlocal ์—ฐ์‚ฐ์ž๋Š” ๋‚ดํฌ๋œ ํ•จ์ˆ˜์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค˜, ์™ธ๋ถ€ ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ๋ง์ด์•ผ. nonlocal์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ณ€๊ฒฝ์€ ๋‚ด๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ , ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„.

์˜ˆ์‹œ:


def outer():
    count = 0

    def inner():
        nonlocal count
        count += 1
        return count

    return inner

counter = outer()
print(counter())  # 1์„ ์ถœ๋ ฅ

๋‹ค์Œ์€ nonlocal์„ ์‚ฌ์šฉํ•˜์—ฌ ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ์‹ค์ œ์ ์ธ ์˜ˆ์‹œ์•ผ:


def create_counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    return increment

counter = create_counter()
print(counter())  # 1์„ ์ถœ๋ ฅ
print(counter())  # 2๋ฅผ ์ถœ๋ ฅ
print(counter())  # 3์„ ์ถœ๋ ฅ

์ด ์˜ˆ์‹œ๋Š” nonlocal์ด ํ˜ธ์ถœ ๊ฐ„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค˜.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION