λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Javascript & NodeJS

[Javascript] ν΄λ‘œμ €(Closure)

by vodkassi 2021. 10. 6.
728x90

ν΄λ‘œμ € (Closure) λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜λŠ” μ€‘μš”ν•œ νŠΉμ„±μœΌλ‘œ, JS 뿐만 μ•„λ‹ˆλΌ ν•˜μŠ€μΌˆμ΄λ‚˜ 슀칼라 λ“±μ˜ 언어에도 λ“±μž₯ν•œλ‹€. MDN 이 μ •μ˜ν•˜λŠ” ν΄λ‘œμ €λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ (λ ‰μ‹œμ»¬) ν™˜κ²½(Lexical environment)의 쑰합이닀.

 

λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ λ…Όμ˜λŠ” 이전 κΈ€μ—μ„œ κ°„λž΅νžˆ ν–ˆμœΌλ‚˜, ν΄λ‘œμ €μ— λŒ€ν•œ 이해λ₯Ό 돕기 μœ„ν•΄μ„œ 깊이 μ•Œμ•„μ•Ό ν•˜λŠ” κ°œλ…μ΄λ―€λ‘œ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ κ°œλ…λΆ€ν„° μ•Œμ•„λ³΄μž. 

 

 

✨  λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό [[Environment]]

 

πŸ“Œ λ ‰μ‹œμ»¬ ν™˜κ²½

 

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό 가지고 μžˆλ‹€. λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ μŠ€μ½”ν”„μ™€ ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ— 따라 κ²°μ •λ˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ΄λ‹€. JS λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ”°λ₯΄κΈ° λ•Œλ¬Έμ—, ν•¨μˆ˜μ˜ 호좜 μœ„μΉ˜κ°€ μ•„λ‹Œ μ •μ˜ν•œ μœ„μΉ˜μ— μ˜ν•΄ μƒμœ„ 객체λ₯Ό μ°Έμ‘°ν•œλ‹€. 

 

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ "μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° (Outer Lexical Environment Reference)" 에 참쑰값을 μ €μž₯ν•¨μœΌλ‘œμ¨ μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό μ—°κ²°λ˜λŠ”λ°, 이 λ•Œ μ €μž₯λ˜λŠ” 참쑰값이 λ°”λ‘œ μƒμœ„ μŠ€μ½”ν”„μ΄λ‹€. 

 

 

πŸ“Œ  ν•¨μˆ˜ 객체의 [[Environment]]

 

λͺ¨λ“  ν•¨μˆ˜λŠ” [[Environment]]라 λΆˆλ¦¬λŠ” μˆ¨κΉ€ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ°, 여기에 ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§„ 곳의 λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°κ°€ μ €μž₯λœλ‹€. ν•¨μˆ˜λŠ” ν•¨μˆ˜μ˜ λ‚΄λΆ€ 슬둯인 [[Environment]] 을 μ΄μš©ν•˜μ—¬ μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½μ„ κΈ°μ–΅ν•œλ‹€. ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ€ ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½ (μƒμœ„ μŠ€μ½”ν”„) 의 μ½”λ“œκ°€ ν‰κ°€λ˜κ³  μžˆλŠ” μ‹œμ μ΄λ―€λ‘œ, μƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ°Έμ‘°κ°’μœΌλ‘œ μ €μž₯λœλ‹€. 

 

μ˜ˆμ‹œ : ν•¨μˆ˜ 호좜 μœ„μΉ˜μ™€ μƒμœ„ μŠ€μ½”ν”„λŠ” 관계 μ—†λ‹€.

const x = 1;

function foo() {
    const x = 10;
    bar();
}

function bar() {
    console.log(x);
}

foo(); // 1
bar(); // 1

 

 

✨  ν΄λ‘œμ € 

μ•žμ„œ ν΄λ‘œμ €λŠ” "ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ (λ ‰μ‹œμ»¬) ν™˜κ²½(Lexical environment)의 μ‘°ν•©" 이라고 μ–˜κΈ°ν–ˆμ—ˆλ‹€. 이λ₯Ό 달리 λ§ν•˜λ©΄, ν΄λ‘œμ €λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μœ μ§€λ˜μ–΄, 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 쀑첩 ν•¨μˆ˜μ΄λ‹€.

 

λ‹€μŒ μ˜ˆμ‹œλ₯Ό 톡해 ꡬ체적인 λ‚΄μš©μ„ μ•Œμ•„λ³΄κ² λ‹€. 

 

const x = 1;

function outer() {
    const x = 10;
    const inner = () => x;
    return inner;
}

const innerFunc = outer();
innerFunc(); // 10

 

μœ„ μ˜ˆμ œμ—μ„œ μ™ΈλΆ€ ν•¨μˆ˜λŠ” outer, 쀑첩 ν•¨μˆ˜λŠ” inner 이닀. outer 의 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œν•˜λŠ” μˆœκ°„μ€ outer ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ μˆœκ°„μ΄λ‹€. (콜 μŠ€νƒμ—μ„œ 이미 제거됨) μ΄λ•Œ, outer 내뢀에 μ„ μ–Έλ˜μ—ˆλ˜ μ‹λ³„μž x 와 값인 10 μ—­μ‹œ 생λͺ… μ£ΌκΈ°κ°€ λ§ˆκ°λ˜μ–΄, ν•΄λ‹Ή λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 방법은 없을 것닀. ν•˜μ§€λ§Œ 이λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•΄ μ£ΌλŠ” 것이 ν΄λ‘œμ €μ΄λ‹€. 

 

inner ν•¨μˆ˜λŠ” μ •μ˜λœ μˆœκ°„ μƒμœ„ μŠ€μ½”ν”„λ₯Ό [[Environment]] ν”„λ‘œνΌν‹°μ— μ €μž₯ν•˜μ˜€μœΌλ©°, inner ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ” ν•œ 이 값은 μœ μ§€λœλ‹€. 비둝 outer ν•¨μˆ˜λŠ” μ’…λ£Œλ˜μ–΄ 콜 μŠ€νƒμ—μ„œ λΉ μ Έλ‚˜κ°”μ–΄λ„, inner ν•¨μˆ˜κ°€ 이λ₯Ό μ°Έμ‘°ν•˜κ³  있기 λ•Œλ¬Έμ— 가비지 μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λ˜μ§€ μ•ŠμœΌλ©°, λ©”λͺ¨λ¦¬ κ³΅κ°„μ—μ„œ ν•΄μ œλ˜μ§€ μ•Šμ•˜λ‹€. 이처럼 쀑첩 ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μ°Έμ‘°ν•˜λŠ” μƒμœ„ ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½λ³΄λ‹€ 더 였래 살아남아도, 바인딩이 λ˜μ–΄ 있기 λ•Œλ¬Έμ— 계속 값을 검색해 올 수 μžˆλŠ” 것이닀. 

 

μœ„μ˜ inner ν•¨μˆ˜λŠ” ν΄λ‘œμ €λΌκ³  ν•  수 μžˆμ§€λ§Œ, μ•„λž˜μ™€ 같이 μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” inner ν•¨μˆ˜λŠ” ν΄λ‘œμ €λΌκ³  ν•  수 μ—†λ‹€.

 

function outer() {
    const x = 1;
    
    function inner() {
    	const z = 2; 
        return z;
    }
    return inner;
}

outer();

 

λ˜ν•œ, μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 생애주기가 짧은 쀑첩 ν•¨μˆ˜ μ—­μ‹œ ν΄λ‘œμ €μ˜ λ³Έμ§ˆμ— μ–΄κΈ‹λ‚˜λ―€λ‘œ, ν΄λ‘œμ €λΌκ³  λΆ€λ₯΄μ§€ μ•ŠλŠ” 것이 μΌλ°˜μ μ΄λ‹€.

 

function outer() {
	const x = 1;
    function inner() {
    	console.log(x);
    }
    inner();
}

outer();

 

πŸ’‘ ν΄λ‘œμ €λŠ” 주둜 정보λ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜κ±°λ‚˜ μœ μ§€ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λœλ‹€. μ΄λŠ” 정보λ₯Ό μ€λ‹‰ν•˜λŠ” OOP 의 μš”μ†ŒμΈ "μΊ‘μŠν™”" 와도 연관성이 λ†’λ‹€. 

 

 

✨  μš”μ•½

- λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ‹λ³„μžμ™€ μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’, 그리고 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•œλ‹€.

- λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ μŠ€μ½”ν”„μ™€ ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ— 따라 κ²°μ •λ˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ΄λ‹€.

- λͺ¨λ“  ν•¨μˆ˜λŠ” ν”„λ‘œνΌν‹°μΈ [[Environment]] 을 μ΄μš©ν•˜μ—¬ μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½κ³Ό λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€. 

- ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 쑰합이닀. κ°„λ‹¨νžˆ λ§ν•˜λ©΄ ν΄λ‘œμ €λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 

 

 

✨  참고자료

 

λŒ“κΈ€