์ค์ฝํ๋ ๋ณ์๊ฐ ์ด์์๋, ํน์ ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฒ์์.
ํจ์๋ ์๋ ์ํ๊ฐ ์์. ๊ฑ ์ธํ ๋ฐ์ผ๋ฉด ์์ํ ๋ด๋ฑ๋๊ฒ ํจ์์.
๊ทธ๋์ ์ด๋ฐ ์ ์ฐจํ ์ธ์ด์ ํ๋ฒํย ํจ์๋ค์ ๋ด๋ถ์ static ๋ณ์(๊ผผ์)๋ฅผย ์ ์ธํ์ง ์๋ ์ด์ ์ํ๋ฅผ ๊ฐ์ง์ง ์์.
์ํ๋ฅผ ๊ฐ์ง์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ์์ ํ ๋นํ ์๊ฐ์กฐ์ฐจ ์ํจ(์ํ๊ฐ ์์ผ๋ฉด.. ์ํ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ ํ์์์ผ๋๊น)
์ค์ ๋ก C์์๋ ํจ์๋ฅผ ๊ฐ๋ฅดํค๋ functionํฌ์ธํฐ๊ฐ์๊ฑด ์์ด๋ ํจ์ ๊ทธ ์์ฒด๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ ์กด์ฌํ์ง์์.
๊ทผ๋ฐ ํจ์๋ฅผ ๋ณ์์ฒ๋ผ ์ทจ๊ธํ๋ฉด ์กด๋ ํธ๋ฆฌํ๋ค๋๊ฑธ ๊นจ๋ซ๊ณ ๊ฒฐ๊ตญ์ modern C++, C#์ผ๋ก ๋์ด์ค๋ฉด์ functor, lambda๊ฐ์ย syntactic sugar๋ฅผ ์ ๊ณตํ๊ฒ๋จ...ย
(์ด๊ฒ ์ syntatic sugar๋๋ฉด ๊ฒฐ๊ตญ ํจ์๊ฐ ๋ณ์์ ์ ์ฅ์ด ์๋๋๊น ๊ทธ ํจ์ ๋ฑ ํ๋๋ฅผ ๊ฐ๋ class๋ฅผ ์์๋ก ๋ง๋ค์ด์ ์ ์ฅํ๋ ์์ผ๋ก ์ฒ๋ฆฌํจ)
๊ทผ๋ฐ ํจ์๊ฐ ์ผ๊ธ๊ฐ์ฒด๋ฉด, ์ฆ ๋ณ์์ฒ๋ผ ์ทจ๊ธํ ์ ์๊ฒ ๋๋ฉด ํจ์๊ฐ ๊ทธ๋ฅ ๋ณ์ ์ ์ธ ํ๋ฏ์ด ํจ์ ์ค๊ฐ์ ๋ฟ ํ๊ณ ์ ์ธ๋ ์ ์์.
๊ทธ๋ฌ๋ฉด ์ค์ฝํ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ ๊น??
์ด๊ฑด ์ธ์ด๋ง๋ค ์ ๊ทผ ๋ฐฉ์์ด ๋ค ๋ค๋ฆ. ์๋ฅผ๋ค์ด ๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ Closure๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ ํํ ๋ฆฌ์ผ์ ๊ตฌํํ ์์์.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ์์ ์ด ํฌํจ๋ ๋ฐ๊นฅ ์ค์ฝํ์ ์ ๊ทผํ ์ ์์. ์์ ๋ ํ ์ ์์!
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ข ์ ๋งคํ ์ํฉ์ด ๋ฐ์ํจ.
๋ณ์๋ ๋์ ์๋ ํจ์๊ฐ ๋ฆฌํด ํด์ฃผ๋ฉด ํจ์ ์ค์ฝํ ๋ฐ์ผ๋ก ๋น ์ ธ๋๊ฐ์ ์๋ ๋์.ย
๊ทธ๋ผ ๋ณ์ํ ๋ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์๊ฐ ๋ฆฌํดํ๋ฉด ๋ฆฌํด๋ ํจ์๊ฐ ์ ๊ทผํ๋ ์ค์ฝํ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ ๊น?ย
๋ณ์ํ ๋ ํจ์๊ฐ ์ ๊ทผํ๊ณ ๋ค๋ฃจ๋ ์ค์ฝํ๊ฐ ํ๊ดด๋๋ฒ๋ฆฌ๋ฉด ํด๋น ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ๋ ํจ์๊ฐ ๊ธฐ๋ฅ์ ์ฝ๊ฑฐ๋ unsafe ํ๊ฒ ๋ ์๋ย ์์.
์ด๊ฑธ ํด๊ฒฐํ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ ๋ณ์ํ๋ ํจ์๋ฅผ ๊ฐ์ธ๊ณ ์๋ ์ค์ฝํ์ ์ค๋ ์ท์ย ๊ฐ์ด ๋ณ์์ ์ ์ฅํ๋ ๊ฒ!
๊ทธ๋์ ์์๊ฐ์ด ๋ง์น ํจ์๊ฐ ์ํ๋ฅผ ๊ฐ์ง๋ ๊ฒ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๊ฒ๋จ. ์ด๋ ๋ฏ ๋ณ์์ ํจ๊ป ์ ์ฅ๋๋ ์ค์ฝํ๋ฅผย ํด๋ก์ ธ๋ผ๊ณ ํจ.
ํํธ ํ์ด์ฌ์?
ํ์ด์ฌ์ Closure ๋ด์ ๋ณ์๋ฅผ ์ฝ์ด์ฌ์๋ ์์ง๋งย ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ค๋ฅด๊ฒย ์์ ํ ์๋ ์์!
์์์ ์ค์ฝํ ๋ฐ์ ์๋ x๋ฅผ ์์ ํ๋ ค๊ณ ํ๋ ์๊ฐ closure๋ ํด์ ๋๊ณ ํด๋น statement๋ ๊ทธ๋ฅ ์ง์ญ๋ณ์ย x๋ฅผ ์ ์ธํ๊ณ 2๋ก ์ด๊ธฐํ ์ํค๋ statement๋ก ๋ณํ๋๊ฒ๋จ.
(ModifyX ํจ์ ๋ด์ ์๋ x = 2๋ x์ 2๋ฅผ ๋์ ํ๋ statement๊ฐ ์๋๋ผ, ํด๋น ์ค์ฝํ ๋ด์ x๋ผ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ์์ฑํ๊ณ 2๋ก ์ด๊ธฐํ ํ๋ผ๋ statement์)
์ด๋ ๋ฏ ์ธ์ด๋ง๋ค ์ค์ฝํ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ด ๋ค ๋ค๋ฅด๊ณ ๋ชจ๋ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์์.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์กด๋ ๋์ด๋ธํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ฌดํํ ์์ ๋๋ฅผ ์ฃผ๋ ๋์ ์จ๊ฐ ์ข ๋ฅ์ ์ฌ์ด๋ ์ดํํธ์ ์ฒ์ ๋ถ์ง๋ก ์น์๋ ๋ณต์ก๋, ๋๋ฒ๊น ์ ์ด๋ ค์์ ๊ฐ๋นํด์ผํจ.
ํ์ด์ฌ์ ๋ณธ๋ ์ฌํํจ, ์๋ฆ๋ค์์ ๋ด์์ฐ๋ ์ธ์ด(Zen of python!)๋ผ ์์ ์๊ธฐ ์ค์ฝํ ๋ฐ์ ๋ณ์๋ฅผ ์์ ํ ์ ์๋๋ก ํด์ ๊นจ๋ํ๊ณ ์์กด์ฑ ์ ์ ํ๋ก๊ทธ๋จ์ ์ง๋๋ก ๊ฐ์ ํจ.
๊ทธ๋ผ ํ์ด์ฌ์์๋ ์ด๋ป๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ Closure๋ฅผ ๊ตฌํํ ๊น?
ํ์ด์ฌ์ ํจ์๋ ๊ฐ์ฒด์. ํ์ด์ฌ์์๋ ๊ฐ์ฒด์ ์๋ฌด ๋๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์์. ์ฆ, ํ์ด์ฌ์ ํจ์๋ ๊ฑ ๊ฐ์ฒด๋ผ์ย ์ง์ง๋ก ๊ฐ์ฒด์ฒ๋ผ ์ํ๋ฅผ ๊ฐ์ง ์ ์์!
์ฌ์ค ์ด๋ ๊ฒ ํจ์์ ์ถ๊ฐ๋ ํ๋กํผํฐ๋ฅผย Closure๋ผ๊ณ ํ ์ ์๋์ง๋ย ํ์ ์ด ์ข ์๊ฐ. ์๋ง ๋ด ์๊ฐ์ Closure๋ผ๊ณ ์๋ถ๋ฅด๋๊ฑฐ ๊ฐ์.
์ฐธ๊ณ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ ํ์ด์ฌ์ฒ๋ผ ๊ฐ์ฒด์ด๊ณ ํ๋กํผํฐ๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๊ธฐ๋๋ฌธ์ ์ ํ์ด์ฌ์ฒ๋ผ ๋๊ฐ์ด ๊ตฌํํ ์๋ ์์. ์ด๋ ๊ฒ ๋ฐํ์์์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋ ์ ์ดย ๋ฐ๋ก ์คํฌ๋ฆฝํธ ์ธ์ด์ ์ฅ์ ์ธ ๋ฏ ํจ.
ํฌ ์๋ฐ ๋ฌ๋ค ๋ฌ์ด
ํจ์๊ฐ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค ์ด ๋ง์ด ์ ์ ํ๊ฒ ์๋บ๋ค์ฌ
ํ์ด์ฌ ํด๋ก์ ๊ธ์ ๋ณด๋ nonlocal ๋ก ํด๊ฒฐํ๋๋ฐ ์ด๊ฒ 2.7์๋ ์์ด์ ์์ ์์ ์ฒ๋ผ ํ๋กํผํฐ ์ถ๊ฐํด์ ํ๋ ใ ใ ;