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
์ด ํธ์ถ ๊ฐ ์ํ๋ฅผ ์ ์งํ๋ ํจ์๋ฅผ ๋ง๋๋ ์ค์ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ค.
GO TO FULL VERSION