Scope๋?
๋ณ์์ ์ ๊ทผํ ์ ์๋ ๋ฒ์. ์๋ณ์๊ฐ ์ ํจํ ๋ฒ์. ์๋ณ์๋ฅผ ๊ฒ์ํ ๋ ์ฌ์ฉํ๋ ๊ท์น
์ฐธ์กฐ ๋์ ์๋ณ์๋ฅผ ์ฐพ์๋ด๊ธฐ ์ํ ๊ท์น์ ์ค์ฝํ๋ผ๊ณ ํ๋ฉฐ ์ด ๊ท์น์ ๋ฐ๋ผ ๋ณ์๋ฅผ ์๋ณํ๋ค.
์๋ณ์๋ ์ด๋ค ๊ฐ์ ๊ตฌ๋ณํ์ฌ ์๋ณํด๋ผ ์ ์๋ ๊ณ ์ ํ ์ด๋ฆ์ ๋งํ๋ค. ๋ฐ๋ผ์ ์ ์ผํ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค. ์ปดํจํฐ์์ ํ์ผ ์ด๋ฆ์ ์ค๋ณต๋ ์ด๋ฆ์ผ๋ก ์ค์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ง์ด๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ค๋ณต๋ ํ์ผ ์ด๋ฆ์ ๊ฐ์ง ์ ์๋๋ฐ ์ด๋ ํด๋๋ผ๋ ๊ฐ๋
์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ์ค์ฝํ๊ฐ ํด๋์ ์ญํ ์ ํ๋ค. ์ ํจ ๋ฒ์๋ฅผ ์ค์ ํด ์๋ณ์์ ์ค๋ณต ์ด๋ฆ ์ถฉ๋์ ๋ง๋๋ค.
์ฆ, ์ค์ฝํ ๋ด์์ ์๋ณ์๋ ์ ์ผํด์ผํ๋ ๋ค๋ฅธ ์ค์ฝํ์์๋ ๊ฐ์ ์ด๋ฆ์ ์๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Scope Chain
๋ชจ๋ ์ค์ฝํ๋ ํ๋์ ๊ณ์ธต์ ๊ตฌ์กฐ๋ก ์ฐ๊ฒฐ๋๋ฉฐ, ๋ชจ๋ ์ง์ญ ์ค์ฝํ์ ์ต์์ ์ค์ฝํ๋ ์ ์ญ ์ค์ฝํ
์ด๋ ๊ฒ ์ค์ฝํ๊ฐ ๊ณ์ธต์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ํ๋ค.
์์ ์ค์ฝํ์์ ์ ํจํ ๋ณ์๋ ํ์ ์ค์ฝํ์์ ์ฐธ์กฐ ๊ฐ๋ฅํ์ง๋ง ํ์ ์ค์ฝํ์์ ์ ํจํ ๋ณ์๋ ์์ ์ค์ฝํ๊ฐ ์ฐธ์กฐํ ์ ์๋ค.
Scope์ ์ข ๋ฅ
scope๋ ์ ํจ ๋ฒ์์ ๋ฐ๋ผ ๋ธ๋ก ์ค์ฝํ์ ํจ์ ์ค์ฝํ 2๊ฐ์ง๋ก ๋๋๋ค.
block-level scope ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ
์ฝ๋ ๋ธ๋ก ๋ด์์ ์ ํจํ( = ์ฐธ์กฐํ ์ ์๋) ์ค์ฝํ
์ค๊ดํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ฝํ์ ๋ฒ์๊ฐ ๊ตฌ๋ถ๋๋ฉฐ, ์ค๊ดํธ ์์์ ์ ์ธํ ๋ณ์๋ ๊ทธ ์ค๊ดํธ ์์์๋ง ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.
๋๋ถ๋ถ์ C-family language๊ฐ ์ด ๊ท์น์ ๋ฐ๋ฅด๊ณ ์๋ค.
function-level scope ํจ์ ๋ ๋ฒจ ์ค์ฝํ
ํจ์ ์ฝ๋ ๋ธ๋ก ๋ด์์ ์ ํจํ ์ค์ฝํ
function์ ๊ธฐ์ค์ผ๋ก ์ค์ฝํ์ ๋ฒ์ ๊ตฌ๋ถํ๋ฉฐ, ํจ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ์ฝ๋ ๋ธ๋ก ๋ด์์๋ง ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.
JS์ var๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฆ(let์ ๋ธ๋ก ์ค์ฝํ)
๋๋ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ ๊ฐ์ง ์ค์ฝํ๋ก ๋๋ ์ ์๋ค.
Dynamic scope ๋์ ์ค์ฝํ
ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ ๊ฒฐ์
Lexical scope ๋ ์์ปฌ ์ค์ฝํ / Static scope ์ ์ ์ค์ฝํ
ํจ์๋ฅผ ์ด๋์ ์ ์ธํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ ๊ฒฐ์
JS๋ฅผ ๋น๋กฏํ ๋๋ถ๋ถ์ ์ธ์ด๋ ๋ ์์ปฌ ์ค์ฝํ์ด๋ค.
scope ๊ท์น
1. ๋ฐ๊นฅ์ชฝ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์์ชฝ ์ค์ฝํ์์ ์ฌ์ฉ โญ๏ธ
๋ฐ๋ฉด์, ์์ชฝ์์ ์ ์ธํ ๋ณ์๋ ๋ฐ๊นฅ์ชฝ ์ค์ฝํ์์๋ ์ฌ์ฉ
2. ์ค์ฝํ๋ ์ค์ฒฉ ๊ฐ๋ฅ
3. ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ ์ค์ฝํ๋ ์ ์ญ ์ค์ฝํ(Global scope), ์ฌ๊ธฐ์ ์ ์ธํ ๋ณ์๋ ์ ์ญ ๋ณ์
์ ์ญ์ด ์๋ ์ค์ฝํ๋ ์ง์ญ ์ค์ฝํ(Local scope)๋ก ์ฌ๊ธฐ์ ์ ์ธํ ๋ณ์๋ ์ง์ญ ๋ณ์
4. ์ง์ญ ๋ณ์๋ ์ ์ญ ๋ณ์๋ณด๋ค ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง
์ง์ญ ๋ณ์๊ฐ ์ ์ญ ๋ณ์์ ๋์ผํ ์ด๋ฆ์ ๋ณ์๋ฅผ ๊ฐ์ง๊ฒฝ์ฐ, ์ง์ญ ๋ณ์๋ฅผ ์ฐ์ ํจ
in JavaScript
function-level scope
JavaScript๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๊ณ ์๋ค.
ํจ์ ์ ์ธ์์ด๋ ํจ์ ํํ์์ ์ฌ์ฉํ๋ฉด ํจ์ ์ค์ฝํ๊ฐ ๋ง๋ค์ด์ง๋ค.
ํ์ดํ ํจ์๋ function ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ํจ์ ์ค์ฝํ๊ฐ ์๋ ๋ธ๋ก ์ค์ฝํ๋ก ์ทจ๊ธ๋๋ค.
โ๏ธ๊ทธ๋ฌ๋ ECMAScript6๋ถํฐ ๋์
๋ let์ ์ฌ์ฉํ์ฌ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Lexical scope
JavaScript๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅธ๋ค.
๋ ์์ปฌ ์ค์ฝํ๋ ํจ์๋ฅผ ์ด๋์ ์ ์ธํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ค.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
JavaScript
๋ณต์ฌ
์ ์ฝ๋์์ bar ํจ์๋ ๋ค๋ฅธ ํจ์๋ ๋ธ๋ก ๋ด์ ์ ์ธ๋์ง ์์์ผ๋ฏ๋ก ์ ์ธ ์์น์ ๋ฐ๋ผ ์์ ์ค์ฝํ๋ ์ ์ญ์ด๋ค.
bar ํจ์ ์คํ ์ 1์ด ์ถ๋ ฅ๋๋ฏ๋ก foo ํจ์ ๋ด์ bar ํจ์๋ 1์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
๋ง์ฝ ๋์ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ด๋จ๊น?
bar ํจ์์ ํธ์ถ ์์น์ ๋ฐ๋ผ ์์ ์ค์ฝํ๋ foo ํจ์๊ฐ ๋๋ค. ๋ฐ๋ผ์ foo ํจ์๋ 10์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
์์ ๊ฐ์ด ํจ์์ ์์ ์ค์ฝํ๋ ํจ์ ์ ์๊ฐ ์คํ๋ ๋ ๊ฒฐ์ ๋จ. ํจ์ ์ ์๊ฐ ์คํ๋์ด ์์ฑ๋ ํจ์ ๊ฐ์ฒด๋ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์์ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํด์ผํ๋ฏ๋ก ์ด๋ฅผ ๊ธฐ์ตํ๋ค. โ closure
ํธ์ด์คํ
์ ์ค์ฝํ ๋จ์๋ก ๋์
var x = 'hi';
function foo() {
console.log(x);
var x = 'bye'; // var ํค์๋์ด๋ฏ๋ก undefined ์ด๊ธฐํ
}
foo(); // undefined
console.log(x) // 'hi'
JavaScript
๋ณต์ฌ
๋ณ์ ์ ์ธ ํค์๋
let
๋ธ๋ก ์ค์ฝํ์ ํจ์ ์ค์ฝํ์์ ์ ํจํ ๋ณ์ ํค์๋
โข
์ฌํ ๋น โญ๏ธ
โข
์ฌ์ ์ธ
let num = 1;
num = 2;
// error!
// let num = 3;
JavaScript
๋ณต์ฌ
const
๊ฐ์ด ๋ณํ์ง ์๋ ์์๋ฅผ ์ ์ํ๋ฉฐ ๋ธ๋ก ์ค์ฝํ์ ํจ์ ์ค์ฝํ์์ ์ ํจํ ๋ณ์ ํค์๋
์ ์ธ๊ณผ ๋์ํด ์ด๊ธฐํํ์ง ์์ผ๋ฉด ๋ฌธ๋ฒ ์๋ฌ ๋ฐ์
๊ฐ์ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก const ํค์๋ ์ฌ์ฉ ์ ์๋ํ์ง ์์ ๊ฐ์ ๋ณ๊ฒฝ์ ๋ง์ ์ ์์
โข
์ฌํ ๋น
โข
์ฌ์ ์ธ
const pi = 3.141592;
// error!
// pi = 5;
// const pi = 0;
JavaScript
๋ณต์ฌ
var
์ ์ญ ๊ฐ์ฒด window์ ํ๋กํผํฐ๋ก ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฌด์ํ๊ณ ํจ์ ์ค์ฝํ๋ง ์ ํจํ๋ค.
โข
์ฌํ ๋น โญ๏ธ
โข
์ฌ์ ์ธ โญ๏ธ
var name = 'soyou';
name = 'soyeon';
var name = 'pongduk';
JavaScript
๋ณต์ฌ
๋ณ์ ํธ์ด์คํ
์ ์ํด ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์. ๊ฐ์ undefined๋ฅผ ๋ฐํ
์ ์ญ ๋ณ์๊ฐ window ๊ธฐ๋ฅ์ ๋ฎ์ด์์์ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค๊ธฐ๋ ํจ.
โ var๋ณด๋ค๋ let ํค์๋ ์ฌ์ฉ ๊ถ์ฅ
์ ์ธ ์์ด ๋ณ์๋ฅผ ์ฌ์ฉํด๋ ์๋ํ๋๋ฐ ๊ตณ์ด ์ ์ธํ ํ์๊ฐ ์๋์?
์ ์ธ ์์ด ๋ณ์๋ฅผ ํ ๋นํ๋ฉด JS ์์ง์ ์ ์ธํ ๋ณ์๋ฅผ window์ ํ๋กํผํฐ๋ก ๋์ ์์ฑํ์ฌ ์ ์ญ ๋ณ์์ฒ๋ผ ์๋ํ๊ฒ ๋๋ค.
์ด๋ฅผ ์๋ฌต์ ์ ์ญ(implicit global)์ด๋ผ๊ณ ํ๋ค.
๋ณ์๋ก ์ ์ธ๋ ๊ฒ์ด ์๋๋ผ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ถ๊ฐ๋์์ ๋ฟ์ด๋ฏ๋ก ํธ์ด์คํ
๋ฌธ์ ๋ ๋ฐ์ํ์ง ์์ผ๋ฉฐ delete ์ฐ์ฐ์๋ก ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ฐ์์ ์์๋ณผ ์ ์ญ ๋ณ์์ ๋ฌธ์ ์ ์ด ๋์ผํ๊ฒ ๋ํ๋๋ค๋ ๋ป์ด๋ฏ๋ก ๋ณ์๋ฅผ ์ ์ธํ ๋๋ ๊ผญ ์ ์ธ ํค์๋๋ฅผ ์ฌ์ฉํด ๋ณ์๋ฅผ ํ ๋นํ์!
window ๊ฐ์ฒด
๋ธ๋ผ์ฐ์ ์๋ง ์กด์ฌํ๋ ๊ฐ์ฒด๋ก ๋ธ๋ผ์ฐ์ ์ ์ฐฝ์ ์๋ฏธํ๋ ๊ฐ์ฒด์ง๋ง ์ด์ ๋ณ๊ฐ๋ก ์ ์ญ ์์ญ์ ๋ด๊ณ ์์
var๋ก ์ ์ธ๋ ์ ์ญ ๋ณ์ ๋ฐ ์ ์ญ ํจ์๋ window ๊ฐ์ฒด์ ์ํจ
ํจ์ ์ ์ธ์์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๊ฑฐ๋ var๋ก ์ ์ญ ๋ณ์๋ฅผ ๋ง๋ค๋ฉด window ๊ฐ์ฒด์์๋ ๋์ผํ ๊ฐ์ ์ฐพ์ ์ ์์
์ ์ญ ๋ณ์๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ฉด?
์๋ฌต์ ๊ฒฐํฉ, ๋ค์์คํ์ด์ค ์ค์ผ
์ ํ๋ฆฌ์ผ์ด์
๋ด์๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ์ง ์์ ์๋ง์ ๋ค๋ฅธ ํจ์์ ๋ก์ง์ด ํฌํจ๋๋ค.
๋ง์ฝ ์ ์ญ ๋ณ์์ ๋ณ์ ์ด๋ฆ์ด ์ค๋ณต๋๋ฉด ๋ค๋ฅธ ํจ์๋ ๋ก์ง์ผ๋ก ์ธํด ๊ฐ์ด ๋ณ๊ฒฝ๋๋ side effect๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ํ ๋นํ ์ ์์.
์ ์ญ ๋ณ์๋ฅผ ์ต์ํ ํ ์๋ก side effect๋ฅผ ์ค์ผ ์ ์๋ค.
์ ์ญ๋ณ์ var ํค์๋๋ ์๋์น ์์ ์ฌํ ๋น์ ์ํ ์ํ๋ณํ๋ก ์ฝ๋๋ฅผ ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ฏ๋ก ์ฌ์ฉ์ ์ง์ํด์ผํจ
๊ธด ์๋ช
์ฃผ๊ธฐ
์ ์ญ ๋ณ์์ ์๋ช
์ฃผ๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ช
์ฃผ๊ธฐ์ ๋์ผ. ์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋์ง ์์ผ๋ฉด ๊ณ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ ํ๊ณ ์๊ฒ ๋๋ค.
์ค์ฝํ ์ฒด์ธ ์์์ ์ข
์ ์ ์กด์ฌ
์ ์ญ๋ณ์์ ๊ฒ์ ์๋๊ฐ ๊ฐ์ฅ ๋๋ฆผ
๋ณ์์ ์ค์ฝํ๋ ์ข์์๋ก ์ข๋ค! ๋ฐ๋ผ์ ์ ์ญ ๋ณ์์ ์ฌ์ฉ์ ์ต์ํ ํด์ผํ๋ค.
์ ์ญ๋ณ์ ์ฌ์ฉ ์ต์ํ
์ ์ญ๋ณ์ ์ฌ์ฉ์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฐ์ง ์๋ค.
์ ์ญ๋ณ์ ๊ฐ์ฒด ์ฌ์ฉ
ํ๋๋ ์ ์ญ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
var MYAPP = {};
MYAPP.cat = {
name: 'munji',
gender: 'female'
};
console.log(MYAPP.cat.name); // munji
JavaScript
๋ณต์ฌ
์ฆ์์คํํจ์ ์ฌ์ฉ
์ฆ์์คํํจ์(Immediately-Invoked Function Expression)๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ ํ ๋ฐ๋ก ์ฌ์ฉ๋์ด ์ ์ญ์์ ์ฌ๋ผ์ง๊ฒ๋๋ค.
(function () {
var MYAPP = {};
MYAPP.cat = {
name: 'munji',
gender: 'female'
};
console.log(MYAPP.cat.name); // munji
}());
console.log(MYAPP.cat.name); // error
JavaScript
๋ณต์ฌ
๋ชจ๋ ํจํด
ํด๋์ค๋ฅผ ๋ชจ๋ฐฉํด ๊ด๋ จ์ด ์๋ ๋ณ์์ ํจ์๋ฅผ ๋ชจ์ ์ฆ์ ์คํ ํจ์๋ก ๊ฐ์ธ ํ๋์ ๋ชจ๋์ ๋ง๋ฆ
โ ํด๋ก์
Strict Mode ์๊ฒฉ ๋ชจ๋
๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋ค ์๊ฒฉํ๊ฒ ์๋ํ๋๋ก ๋ง๋ค์ด์ฃผ๋ ๋ชจ๋
์ ์ธ ์๋ ๋ณ์ ํ ๋น์ ๊ฒฝ์ฐ๋ strict mode์์๋ ์๋ฌ๋ก ํ๋จํด์ฃผ์ด ์ค์๋ฅผ ๋ง์ ์ ์๋ค.
'use strict';
HTML
๋ณต์ฌ
in Python (Writting)
LEGB Rule
ํ์ด์ฌ ๋ณ์์ scope ๋ฃฐ์ LEGB ๋ฃฐ์ด๋ผ๊ณ ํจ.
ํ์ด์ฌ์ ๋ณ์๋ ํจ์์ ์ ์๋ฅผ ์ฐพ์ ๋,
Local > Enclosed > Global > Built-in์ ์์๋๋ก ๊ฐ์ ์ฐพ์
โข
local - ๊ฐ์ฅ ๊ฐ๊น์ด ํจ์ ์ ๋ฒ์
โข
Enclosed - ๊ฐ์ฅ ๊ฐ๊น์ด ํจ์๊ฐ ์๋ ๊ทธ ๋ค์์ผ๋ก ๊ฐ๊น์ด ํจ์ ๋ฒ์๋ฅผ ๊ฐ๋ฆฌํด
โข
Global - ํจ์ ๋ฐ๊นฅ์ ๋ณ์๋ import๋ Module
โข
Built-in - ๊ฐ์ฅ ๊ด๋ฒ์ํ scope. ํ์ด์ฌ ์์ ๋ด์ฅ๋์ด ์๋ ํจ์ ๋๋ ์์ฑ๋ค๋ก ๋ฐ๋ก ์ ์ธ์ด ์์ด๋ ๋ชจ๋ ํ์ด์ฌ ํ์ผ์์ ์ ํจํ ๋ฒ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
>>> a = 5 # Global
>>> b = 10 # Global
>>> def outer():
... a = 10 # outerํจ์์ local์ด๋ฉฐ, innerํจ์์ Enclosed
... def inner():
... c=30 # inner ํจ์์ local
... print(a, b, c)
... inner()
... a = 22 # outerํจ์์ local์ด๋ฉฐ, innerํจ์์ Enclosed
... inner()
...
>>> outer()
10 10 30
22 10 30
Python
๋ณต์ฌ
โข
locals() : ๋ก์ปฌ ๋ณ์ ํ์ธ
โข
globals() : ๊ธ๋ก๋ฒ ๋ณ์ ํ์ธ
>> a = 1
>> def foo():
b = 3
>> foo()
a in global(): True
b in global(): False
Python
๋ณต์ฌ
Reference
๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive, ์ด์
๋ชจ, ์ํค๋ถ์ค - p.189 ~