Javascript/이둠

JavaScript | ν΄λ‘œμ €λž€ 무엇인가?

Kim_gorilla 2020. 6. 6. 22:33

πŸ‘¨‍πŸ’» JavaScript | ν΄λ‘œμ €λž€ 무엇인가?

 

μ˜€λŠ˜μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν΄λ‘œμ €λΌλŠ” κ°œλ…μ— λŒ€ν•΄μ„œ μ΄ν•΄ν•˜κ³  μ™œ μ‚¬μš©ν•˜λŠ”μ§€μ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μš°λ¦¬κ°€ ν•™μŠ΅ν•  λ‚΄μš©μ„ μ •λ¦¬ν•΄λ³΄μžλ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

  1. ν΄λ‘œμ €μ˜ κ°œλ…
  2. ν΄λ‘œμ €λŠ” μ–Έμ œ μ‚¬μš©λ˜μ–΄μ§€λŠ”κ°€?
  3. ν΄λ‘œμ €λ₯Ό μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

1. ν΄λ‘œμ €μ˜ κ°œλ…

"μƒν™œμ½”λ”©"μ—μ„œ ν΄λ‘œμ €μ— λŒ€ν•œ μ •μ˜λ₯Ό λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

ν΄λ‘œμ €(closure)λŠ” λ‚΄λΆ€ν•¨μˆ˜κ°€ μ™ΈλΆ€ν•¨μˆ˜μ˜ λ§₯락(context)에 μ ‘κ·Όν•  수 μžˆλŠ” 것을 κ°€λ₯΄ν‚¨λ‹€. ν΄λ‘œμ €λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ΄μš©ν•œ κ³ λ‚œμ΄λ„μ˜ ν…Œν¬λ‹‰μ„ κ΅¬μ‚¬ν•˜λŠ”λ° ν•„μˆ˜μ μΈ κ°œλ…μœΌλ‘œ ν™œμš©λœλ‹€.  

μ°Έκ³ μ‚¬μ΄νŠΈ

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” νŠΉμ • ν•¨μˆ˜ 내뢀에 λ˜λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ”κ²ƒμ΄ κ°€λŠ₯ν•œλ°μš”, 이것을 'λ‚΄λΆ€ν•¨μˆ˜' 라고 λΆ€λ₯΄λ©° 이것을 톡해 κ΅¬ν˜„ν•œ 것이 'ν΄λ‘œμ €' μž…λ‹ˆλ‹€.

 

일단 λ‚΄λΆ€ν•¨μˆ˜κ°€ 무엇인지 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ 예제λ₯Ό λ³΄μ‹œλ©΄ innerFuncμ΄λΌλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ 읡λͺ…ν•¨μˆ˜λ₯Ό return문을 톡해 λ°˜ν™˜ν•˜λŠ” 것을 보싀 수 μžˆμŠ΅λ‹ˆλ‹€. 

이와같이 ν•¨μˆ˜ 내뢀에 λ˜λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•œκ²ƒμ„ μ˜λ―Έν•˜λ©° μœ„μ— μ½”λ“œμ˜ μ‹€ν–‰κ²°κ³Όλ‘œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν₯미둜운 사싀은 λ‚΄λΆ€ν•¨μˆ˜λŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜(μœ„μ½”λ“œμ—μ„œλŠ” textλ³€μˆ˜)에 접근이 κ°€λŠ₯ν•˜λ‹€λŠ” μ μž…λ‹ˆλ‹€.

 

일반적으둜 μš°λ¦¬κ°€ μ•Œκ³ μžˆλŠ” ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λŠ” ν•¨μˆ˜μ˜ 라이프사이클과 ν•¨κ»˜ν•˜λ©°, 본인의 역할을 λ‹€ ν•˜κ³  μ’…λ£Œλ˜μ—ˆμ„λ•Œ 가지고 있던 μ§€μ—­λ³€μˆ˜λ„ 같이 μ‚¬λΌμ§€κ²Œ λ©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, λ‚΄λΆ€ν•¨μˆ˜λ₯Ό 톡해 μ ‘κ·Όν•œ μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ“€μ˜ 값은 μ™ΈλΆ€ν•¨μˆ˜μ˜ 싀행이 λλ‚˜μ„œ μ†Œλ©Έλœ 이후에도 μ™ΈλΆ€μ—μ„œ μ €μž₯ν•œ λ‚΄λΆ€ν•¨μˆ˜λ₯Ό 톡해 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 말둜 μ„€λͺ…ν•˜λ‹ˆ 쑰금 μ–΄λ €μš΄κ²ƒ κ°™μœΌλ‹ˆ 예제λ₯Ό 톡해 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

μ•„λž˜μ˜ μ˜ˆμ œμ—μ„œλŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ νŠΉμ • 이름(name)을 받아와 μƒˆλ‘œμš΄ λ¬Έμžμ—΄(text)을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.  그리고 이 λ¬Έμžμ—΄μ„ λ‚΄λΆ€ν•¨μˆ˜λ₯Ό 톡해 console에 좜λ ₯을 ν•˜κ²Œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 

μœ„μ˜ 14~16쀄을 보면 μ™ΈλΆ€ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” 뢀뢄을 보싀 수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 이 μ™ΈλΆ€ν•¨μˆ˜λŠ” 16쀄 μ΄ν›„μ—μ„œ μ’…λ£Œλ˜μ–΄ μ‚¬λΌμ§€κ²Œ λ˜μ–΄μ§€μ£ . μ‹€ν–‰λœ 각 μ™ΈλΆ€ν•¨μˆ˜λ“€μ€ λ‚΄λΆ€ν•¨μˆ˜λ“€μ„ λ°˜ν™˜ν•˜μ—¬ test1~3 λ³€μˆ˜μ— 각각 μ €μž₯λ˜μ–΄μ§€κ²Œ λ©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ 각 test1~3λ³€μˆ˜μ— μ €μž₯이 된 μ£Όμ²΄λŠ” λ‚΄λΆ€ν•¨μˆ˜κΈ° λ•Œλ¬Έμ— μ’…λ£Œλ˜μ–΄ μ†Œλ©Έλœ μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ“€ λ˜ν•œ μ†Œλ©Έμ΄ λ˜μ–΄μ•Ό 할것 κ°™μ§€λ§Œ, 20~22λ²ˆμ€„μ„ μ‹€ν–‰ν•œ κ²°κ³Όκ°€ μ•„λž˜μ™€κ°™μ΄ λ‚˜μ˜€λŠ” 것을 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν΄λ‘œμ €λŠ” λ‚΄λΆ€ν•¨μˆ˜μ™€ λ°€μ ‘ν•œ 관계λ₯Ό 가지고 μžˆλŠ” μ£Όμ œμž…λ‹ˆλ‹€. λ‚΄λΆ€ν•¨μˆ˜λŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 μžˆλŠ”λ° μœ„μ˜ 결과처럼 μ™ΈλΆ€ν•¨μˆ˜μ˜ 싀행이 λλ‚˜μ„œ μ™ΈλΆ€ν•¨μˆ˜κ°€ μ†Œλ©Έλœ 이후에도 λ‚΄λΆ€ν•¨μˆ˜κ°€ μ™ΈλΆ€ν•¨μˆ˜μ˜ λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ ν΄λ‘œμ €λΌκ³  ν•©λ‹ˆλ‹€.

 

μš”μ•½ν•΄μ„œ ν΄λ‘œμ €λž€ λ‚΄λΆ€ν•¨μˆ˜κ°€ μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 있고, μ™ΈλΆ€ν•¨μˆ˜λŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ‚΄λΆ€ν•¨μˆ˜κ°€ μ†Œλ©Έλ  λ•ŒκΉŒμ§€ μ†Œλ©Έλ˜μ§€ μ•ŠλŠ” νŠΉμ„±μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

μ°Έκ³ μ‚¬μ΄νŠΈ

2. ν΄λ‘œμ €λŠ” μ–Έμ œ μ‚¬μš©λ˜μ–΄μ§€λŠ”κ°€?

ν΄λ‘œμ €λŠ” λ‚΄λΆ€ν•¨μˆ˜μ™€ λ°€μ ‘ν•œ 관계가 μžˆλ‹€κ³  μœ„μ—μ„œ μ„€λͺ…을 λ“œλ ΈλŠ”λ°μš”, μ—¬κΈ°μ„œ λ‚΄λΆ€ν•¨μˆ˜λŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ₯Ό κ°€μ Έλ‹€ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€ λ§μ”€λ“œλ Έμ—ˆμŠ΅λ‹ˆλ‹€. 사싀 λ‚΄λΆ€ν•¨μˆ˜λŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜ 뿐 μ•„λ‹ˆλΌ λ§€κ°œλ³€μˆ˜κ°’λ„ μ°Έμ‘°ν•΄μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•œλ°μš”, μ΄λŸ¬ν•œ κΈ°λŠ₯은 창의적인 λ°©λ²•μœΌλ‘œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ•„λž˜μ˜ λ‚΄λΆ€(private)λ³€μˆ˜μ˜ˆμ œλŠ” λ”κΈ€λΌμŠ€ ν¬λ½ν¬λ“œ(Douglas Crockford)에 μ˜ν•΄ 처음 μ‹œμ—°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ν΄λ‘œμ €μ™€ 객체(Dictionary)λ₯Ό μ΄μš©ν•΄μ„œ 마치 클래슀의 Getter ν•¨μˆ˜, Setterν•¨μˆ˜μ™€ 같은 κΈ°λŠ₯을 ν•˜λ„λ‘ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μž‘μ„±ν•˜κ²Œ λœλ‹€λ©΄ κ·Έμ € μ™ΈλΆ€ν•¨μˆ˜ μ§€μ—­λ³€μˆ˜μ˜ 값을 μ½μ–΄μ˜€λŠ”κ²ƒ 뿐 μ•„λ‹ˆλΌ κ·Έ 값을 λ³€κ²½ν•˜λŠ”κ²ƒμ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. 

 

또 λ‹€λ₯Έ μ˜ˆμ œλ‘œλŠ” 반볡문 ν΄λ‘œμ € μ˜ˆμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ œλŠ” λ‹¨μˆœνžˆ 0~9의 값을 setTimeout ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 좜λ ₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ§Œμ•½ ν΄λ‘œμ €λ₯Ό κ³ λ €ν•˜μ§€ μ•Šκ³  이λ₯Ό κ΅¬ν˜„ν•˜λΌκ³  ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±μ„ ν•˜κ²Œ λ κ²ƒμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μž‘μ„±λœ μ½”λ“œμ˜ κ²°κ³ΌλŠ” μš°λ¦¬κ°€ μ˜ˆμƒν–ˆλ˜ 0~9의 값을 좜λ ₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 10의 값을 λ°˜λ³΅ν•΄μ„œ μ°μ–΄μ£Όκ²Œ λ©λ‹ˆλ‹€.

μ΄μœ μ¦‰μŠ¨, setTimeout ν•¨μˆ˜μ— 인자둜 λ„˜μ–΄κ°„ 읡λͺ…ν•¨μˆ˜λŠ” λͺ¨λ‘ 0.1초 뒀에 호좜이 λ˜μ–΄μ§€κ²Œ 될텐데 κ·Έ μ‹œκ°„ 사이에 반볡문이 μ „λΆ€ λŒμ•„ i값을 10으둜 λ§Œλ“€μ–΄ 버렸기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

이λ₯Ό μš°λ¦¬κ°€ μ›ν–ˆλ˜ 0~9의 값이 좜λ ₯λ˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν΄λ‘œμ €λ₯Ό μ΄μš©ν•˜μ—¬ 맀 λ°˜λ³΅μ‹œ μ¦κ°€λ˜λŠ” i값을 λ§€κ°œκ°’μœΌλ‘œ λ°›λŠ” μ™ΈλΆ€ν•¨μˆ˜ ν•˜λ‚˜λ₯Ό μƒμ„±ν•˜κ³  κ·Έμ•ˆμ—μ„œ i값을 λ°›μ•„ setTimeout을 μ‹€ν–‰ν•˜λŠ” λ‚΄λΆ€ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ ν•΄μ£Όκ²Œ 되면, μ™ΈλΆ€ν•¨μˆ˜λ₯Ό 반볡횟수만큼 μ‹€ν–‰ν•œ 상황이 λ§Œλ“€μ–΄μ§€κ³  각 μ™ΈλΆ€ν•¨μˆ˜ λ§€κ°œκ°’μœΌλ‘œ i값을 λ„˜κ²¨μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— 이λ₯Ό λ‚΄μž₯ν•¨μˆ˜κ°€ μ°Έμ‘°ν•΄μ„œ μ‚¬μš©ν•  수 있게 λ˜μ–΄μ§€λŠ” 것이죠.

 

이λ₯Ό μ‹€ν–‰ν•˜κ²Œ 되면 μš°λ¦¬κ°€ μ˜ˆμΈ‘ν•œλŒ€λ‘œ 잘 좜λ ₯이 λ˜μ–΄μ§‘λ‹ˆλ‹€.

μ°Έκ³ μ‚¬μ΄νŠΈ

3. ν΄λ‘œμ €λ₯Ό μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜κ°€ μ„ μ–Έλ  λ•Œ μžμ‹ μ΄ μ ‘κ·Όν•  μˆ˜ μžˆλŠ” λ²”μœ„λ₯Ό μ •ν•˜κ³  κΈ°μ–΅ν•˜κ³  μžˆλŠ”데 μ΄κ²ƒμ„ λ ‰μ‹œμ»¬ μŠ€μ½”프라고 ν•©λ‹ˆλ‹€. κ·Έλ¦¬κ³  μ΄λŸ° λ ‰μ‹œμ»¬ μŠ€μ½”프에 μ˜ν•΄ μ™ΈλΆ€ ν•¨μˆ˜μ˜ ν™˜κ²½μ„ κΈ°μ–΅ν•˜κ³  μžˆλŠ” λ‚΄λΆ€ ν•¨μˆ˜κ°€ ν΄λ‘œμ €μž…λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ "lexical"μ΄λž€, μ–΄νœ˜μ  λ²”μœ„ 지정(lexical scoping) κ³Όμ •μ—μ„œ λ³€μˆ˜κ°€ μ–΄λ””μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œμ§€ μ•ŒκΈ° μœ„ν•΄ κ·Έ λ³€μˆ˜κ°€ μ†ŒμŠ€μ½”λ“œ λ‚΄ μ–΄λ””μ—μ„œ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ κ³ λ €ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 단어 "lexical"은 μ•žμ—μ„œ μ •μ˜ν•œ 의미λ₯Ό 가지며, μ€‘μ²©λœ ν•¨μˆ˜λŠ” μ™ΈλΆ€ λ²”μœ„(scope)μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜μ—λ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν΄λ‘œμ €λŠ” ν΄λž˜μŠ€μ™€ κ½€λ‚˜ λΉ„μŠ·ν•œ ꡬ쑰λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 클래슀 κ°œλ…μ΄ μ—†λŠ”(ES6μ—μ„œλŠ” μžˆμŠ΅λ‹ˆλ‹€.) μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 클래슀λ₯Ό λŒ€μ‹ ν•˜μ—¬ 쓰이기도 ν•©λ‹ˆλ‹€. 

 

κ·Έλ ‡λ‹€λ©΄ 객체지ν–₯적 κ°œλ°œμ„ μœ„ν•΄μ„œ ν΄λ‘œμ €λ₯Ό 무쑰건 μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ’‹μ„κΉŒμš”?

κ·Έμ—λŒ€ν•œ λŒ€λ‹΅μ€ "μ μ ˆν•œ 상황에 μ‚¬μš©ν•˜λ˜ λ©”λͺ¨λ¦¬ν• λ‹Ήμ„ ν•΄μ œμ‹œμΌœμ£Όμž" 라고 λ‹΅λ³€λ“œλ¦¬κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

 

ν΄λ‘œμ €λŠ” 각자의 ν™˜κ²½μ„ κ°€μ§‘λ‹ˆλ‹€. μ΄ν™˜κ²½μ„ κΈ°μ–΅ν•˜κΈ° μœ„ν•΄μ„œ μ™ΈλΆ€ν•¨μˆ˜μžμ²΄λ₯Ό μ†Œλ©Έμ‹œν‚€μ§€ μ•Šκ³  κΈ°μ–΅ν•˜κΈ° λ•Œλ¬Έμ— λ‹Ήμ—°νžˆ λ©”λͺ¨λ¦¬ λ˜ν•œ μ†Œλͺ¨λ˜μ–΄μ§ˆκ²λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν΄λ‘œμ €λ₯Ό 생성해놓고 μ°Έμ‘°λ₯Ό μ œκ±°ν•˜μ§€ μ•ŠλŠ” 것은 C++μ—μ„œ λ™μ ν• λ‹ΉμœΌλ‘œ 객체λ₯Ό 생성해놓고 λ©”λͺ¨λ¦¬ν• λ‹Ήμ„ ν•΄μ œν•˜μ§€ μ•ŠλŠ”κ²ƒκ³Ό λΉ„μŠ·ν•©λ‹ˆλ‹€. 

즉, ν΄λ‘œμ €λ₯Ό 톡해 λ‚΄λΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν›„ μ‚¬μš©μ΄ λλ‚˜λ©΄ μ°Έμ‘°λ₯Ό μ œκ±°ν•˜λŠ”κ²ƒμ΄ λ©”λͺ¨λ¦¬ νš¨μœ¨μ— μ’‹λ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

그렇기에 μœ„μ™€κ°™μ΄ 닡변을 λ“œλ¦΄μˆ˜ μžˆκ² λ„€μš” : )

 

μ°Έκ³ μ‚¬μ΄νŠΈ

 

 

πŸ“Œ μ„œλΈŒμ œλͺ©

.