Skip to content

Latest commit

Β 

History

History
776 lines (450 loc) Β· 45.5 KB

javascript.md

File metadata and controls

776 lines (450 loc) Β· 45.5 KB

JavaScript

JS 핡심 κ°œλ…

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 무슨 μ–Έμ–΄μΈκ°€μš”?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›Ή νŽ˜μ΄μ§€μ—μ„œ λ³΅μž‘ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλŠ” μŠ€ν¬λ¦½νŒ… λ˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” κ³ μˆ˜μ€€μ˜ 언어이고, 인터프리터 기반의 μ–Έμ–΄μž…λ‹ˆλ‹€. λ˜ν•œ, ν”„λ‘œν† νƒ€μž…μ„ 기반으둜 ν•œ 객체지ν–₯ μ–Έμ–΄μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ…λ Ήν˜•, ν•¨μˆ˜ν˜•, 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ λͺ¨λ‘ κ°€λŠ₯ν•œ λ©€ν‹° νŒ¨λŸ¬λ‹€μž„ μ–Έμ–΄μž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 동적 언어인 μ΄μœ λŠ” λ¬΄μ—‡μΈκ°€μš”?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©°, μ‹€ν–‰ 쀑에 값이 λ³€κ²½λ˜λ©΄ 그에 따라 νƒ€μž…λ„ λ³€ν•˜λŠ” λ™μ νƒ€μž…μž…λ‹ˆλ‹€.

λ˜ν•œ, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 컴파일 νƒ€μž„μ΄ μ•„λ‹Œ λŸ°νƒ€μž„μ— νƒ€μž…μ„ κ²°μ •ν•©λ‹ˆλ‹€.

객체도 속성을 λ™μ μœΌλ‘œ μΆ”κ°€ 및 μ‚­μ œν•  수 μžˆμœΌλ―€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ™μ μ–Έμ–΄μž…λ‹ˆλ‹€.

ν΄λ‘œμ €λž€ 무엇이고 μ μš©ν• λ•Œ μ£Όμ˜ν• μ μ€ λ¬΄μ—‡μΈκ°€μš”?

**ν΄λ‘œμ €(Closure)**λŠ” λ‚΄λΆ€ ν•¨μˆ˜κ°€ μžμ‹ μ΄ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κΈ°μ–΅ν•˜μ—¬, μ™ΈλΆ€ ν•¨μˆ˜κ°€ μ’…λ£Œλœ 이후에도 κ·Έ ν™˜κ²½μ— μ ‘κ·Όν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ§ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜λ₯Ό λ‚΄λΆ€ ν•¨μˆ˜κ°€ 계속 μ°Έμ‘°ν•˜κ³  μžˆμ„ 경우, ν•΄λ‹Ή λ³€μˆ˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 사라져도 λ©”λͺ¨λ¦¬μ— μœ μ§€λ©λ‹ˆλ‹€.

이 νŠΉμ„± 덕뢄에 ν΄λ‘œμ €λŠ” 정보 은닉, μƒνƒœ μœ μ§€, 콜백 ꡬ성 λ“± λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ μ“°μž…λ‹ˆλ‹€.

λ‹€λ§Œ, ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ— μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•œ λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ˜€λž«λ™μ•ˆ μœ μ§€λ˜λ©΄, ν•΄λ‹Ή λ³€μˆ˜λ„ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ μ•Šμ•„ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ 계속될 수 μžˆμŠ΅λ‹ˆλ‹€. 특히 이벀트 λ¦¬μŠ€λ„ˆλ‚˜ 타이머 λ‚΄λΆ€μ—μ„œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ”, 더 이상 ν•„μš”ν•˜μ§€ μ•Šλ‹€λ©΄ μ°Έμ‘°λ₯Ό λŠκ±°λ‚˜ null둜 μ„€μ •ν•˜λŠ” λ“±μ˜ 정리 μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

λ˜ν•œ, ν΄λ‘œμ €λŠ” λ³€μˆ˜λ₯Ό 값이 μ•„λ‹Œ 참쑰둜 κΈ°μ–΅ν•˜κΈ° λ•Œλ¬Έμ—, ν΄λ‘œμ €λ₯Ό κ³΅μœ ν•˜λŠ” μ—¬λŸ¬ ν•¨μˆ˜κ°€ λ™μΌν•œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ²Œ 되면, μ˜λ„μΉ˜ μ•Šμ€ κ°’ 변경이 λ°œμƒν•  수 μžˆμ–΄ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” ν™˜κ²½ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” κ°μ²΄μž…λ‹ˆλ‹€.

μ „μ—­ μ½”λ“œκ°€ 싀행될 λ•Œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³ , ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ 각각의 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ©λ‹ˆλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μŠ€νƒ ꡬ쑰(Execution Context Stack)둜 κ΄€λ¦¬λ˜λ©°, κ°€μž₯ μœ„μ— μžˆλŠ” μ»¨ν…μŠ€νŠΈκ°€ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

ν΄λ‘œμ €μ™€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ—°κ΄€μ§€μ–΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜κ°€ 호좜되면 μƒˆλ‘œμš΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³ , ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈμ—λŠ” λ³€μˆ˜ 객체, μŠ€μ½”ν”„ 체인, this κ°’ 등이 ν¬ν•¨λ©λ‹ˆλ‹€.

μ΄λ•Œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλœ ν•˜μœ„ ν•¨μˆ˜λŠ”, μƒμœ„ ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ 이후에도 μžμ‹ μ΄ 선언될 λ‹Ήμ‹œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μŠ€μ½”ν”„ 체인을 톡해 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이처럼 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‚¬λΌμ‘Œμ§€λ§Œ, ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ λ‚΄λΆ€ ν•¨μˆ˜μ— μ˜ν•΄ 계속 μœ μ§€λ˜λ©° μ°Έμ‘°λ˜λŠ” ꡬ쑰가 λ°”λ‘œ ν΄λ‘œμ €μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.

즉, ν΄λ‘œμ €λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ’…λ£Œλœ 이후에도 κ·Έ μ•ˆμ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜ 이라고 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜λ‘œ, μ‹€ν–‰ 쀑인 μ½”λ“œμ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ„ μ–Έ, μƒμœ„ μŠ€μ½”ν”„ 정보 등을 λ‹΄κ³  μžˆλŠ” κ°μ²΄μž…λ‹ˆλ‹€.

β€œEnvironment Record” : μ‹€μ œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ‹λ³„μžμ™€ 값듀을 μ €μž₯

β€œOuter Enviroment Reference” : μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° ← 이걸 톡해 μŠ€μ½”ν”„ 체이닝

μŠ€μ½”ν”„(Scope)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μŠ€μ½”ν”„λŠ” λ³€μˆ˜λ‚˜ ν•¨μˆ˜κ°€ μœ νš¨ν•œ λ²”μœ„, 즉 ν•΄λ‹Ή λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” μ½”λ“œμ˜ μ˜μ—­μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

μŠ€μ½”ν”„μ˜ μ’…λ₯˜μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.
  1. κΈ€λ‘œλ²Œ μŠ€μ½”ν”„ : λ³€μˆ˜λ‚˜ ν•¨μˆ˜κ°€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ—μ„œ 접근이 κ°€λŠ₯ν•œ 경우
  2. ν•¨μˆ˜ μŠ€μ½”ν”„ : ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” κ·Έ ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•¨
  3. 블둝 μŠ€μ½”ν”„ :Β letμ΄λ‚˜Β const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” 블둝 λ‚΄μ—μ„œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€.
μŠ€μ½”ν”„ 체인에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μŠ€μ½”ν”„ 체인은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό 찾을 λ•Œ, 각 μŠ€μ½”ν”„μ˜ 관계에 따라 λ³€μˆ˜λ₯Ό μ°¨λ‘€λ‘œ κ²€μƒ‰ν•˜λŠ” 체인 κ΅¬μ‘°μž…λ‹ˆλ‹€. 이 체인은 λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 있게 ν•©λ‹ˆλ‹€.

즉, κ°€μž₯ μ•ˆμͺ½λΆ€ν„° λ³€μˆ˜λ₯Ό 찾을 λ•ŒκΉŒμ§€ λ°”κΉ₯μͺ½μœΌλ‘œ μŠ€μ½”ν”„λ₯Ό λ„“ν˜€λ‚˜κ°‘λ‹ˆλ‹€.

ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹€ν–‰ 전에 μ½”λ“œ 전체λ₯Ό νŒŒμ‹±ν•˜κ³ , μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ 선언이 λ©”λͺ¨λ¦¬μ— λ“±λ‘λ˜λ©°, 이λ₯Ό ν˜Έμ΄μŠ€νŒ…(Hoisting)이라고 ν•©λ‹ˆλ‹€.

ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에, λ³€μˆ˜ 및 ν•¨μˆ˜ 선언을 ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ κ°€μž₯ μœ„μͺ½μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” 방식을 λ§ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ μ½”λ“œκ°€ 물리적으둜 μ΄λ™ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό μ²˜λ¦¬ν•  λ•Œ κ·Έλ ‡κ²Œ ν•΄μ„ν•œλ‹€κ³  μ΄ν•΄ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 μ„ μ–Έ(Declaration)만 λŒμ–΄μ˜¬λ €μ§„λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 값을 ν• λ‹Ή(Assignment)ν•˜λŠ” 뢀뢄은 μ›λž˜ μžλ¦¬μ— κ·ΈλŒ€λ‘œ λ‚¨μ•„μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ©”λͺ¨λ¦¬ 관리에 λŒ€ν•΄ μ•„λŠ” λŒ€λ‘œ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μžλ™ λ©”λͺ¨λ¦¬ 관리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό λ¨Όμ € μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” μŠ€νƒκ³Ό νž™. 두 κ°€μ§€λ‘œ λ‚˜λˆ„μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€. μŠ€νƒμ—λŠ” μ›μ‹œνƒ€μž…μ„ μ €μž₯ν•˜κ³ , νž™μ—λŠ” κ°μ²΄νƒ€μž…μ„ μ €μž₯ν•©λ‹ˆλ‹€.

λͺ¨λ“  λ³€μˆ˜λŠ” λ¨Όμ € μŠ€νƒμ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€. μ›μ‹œ 값이 μ•„λ‹Œ 경우 μŠ€νƒμ—λŠ” νž™μ˜ 객체에 λŒ€ν•œ μ°Έμ‘°κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. νž™μ˜ λ©”λͺ¨λ¦¬λŠ” νŠΉμ •ν•œ λ°©μ‹μœΌλ‘œ μ •λ ¬λ˜μ§€ μ•ŠμœΌλ―€λ‘œ, μŠ€νƒμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μŠ€νƒμ˜ 경우, ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ“€μ€ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ μžλ™μœΌλ‘œ μ •λ¦¬λ©λ‹ˆλ‹€. νž™μ˜ κ²½μš°λŠ”, κ°€λΉ„μ§€ 컬렉터λ₯Ό 톡해 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μžλ™μœΌλ‘œ μ œκ±°ν•©λ‹ˆλ‹€.

μ°Έκ³  : [λ²ˆμ—­] μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ©”λͺ¨λ¦¬ 관리 μ„€λͺ…

콜 μŠ€νƒ (Call Stack)κ³Ό νž™ (Heap)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

콜 μŠ€νƒμ€ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μŒ“μ΄λŠ” μŠ€νƒκ΅¬μ‘°μž…λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μŠ€νƒμ— μΆ”κ°€λ˜κ³ , 싀행이 λλ‚˜λ©΄ μ œκ±°λ©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 단일 μŠ€λ ˆλ“œ ν™˜κ²½μ΄λ―€λ‘œ 콜 μŠ€νƒμ΄ ν•˜λ‚˜λΏμž…λ‹ˆλ‹€.

νž™μ€ 동적 λ©”λͺ¨λ¦¬ 할당을 λ‹΄λ‹Ήν•˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. 콜 μŠ€νƒμ²˜λŸΌ μ •ν•΄μ§„ ꡬ쑰가 μ—†μœΌλ©°, 객체와 같은 μ°Έμ‘°ν˜• 데이터가 μ €μž₯λ©λ‹ˆλ‹€. κ°€λΉ„μ§€ 컬렉터에 μ˜ν•΄ 객체λ₯Ό 정리해 λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬λ©λ‹ˆλ‹€.

JSμ—μ„œ Garbage Collection에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” κ°œλ°œμžκ°€ 직접 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œν•˜λŠ” μ–Έμ–΄λ“€κ³Ό 달리, μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μ•Œμ•„μ„œ μ •λ¦¬ν•΄μ£ΌλŠ”Β μžλ™ λ©”λͺ¨λ¦¬ 관리 기λŠ₯을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯을 λ°”λ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

핡심 μ•„μ΄λ””μ–΄λŠ”Β '더 이상 도달 κ°€λŠ₯ν•˜μ§€ μ•Šμ€(unreachable)' 객체λ₯Ό μ°Ύμ•„ λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ '도달 κ°€λŠ₯'ν•˜λ‹€λŠ” 것은, μ½”λ“œ μ–΄λ”˜κ°€μ—μ„œ μ°Έμ‘°λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

이 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ 덕뢄에 κ°œλ°œμžλŠ” λ©”λͺ¨λ¦¬ 관리에 λŒ€ν•œ 뢀담을 크게 덜 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ™„μ „νžˆ μ‹ κ²½ μ“°μ§€ μ•Šμ•„λ„ λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό μ½”λ“œ μ–΄λ”˜κ°€μ— 남겨두면 κ°€λΉ„μ§€ 컬렉터가 κ·Έ 객체λ₯Ό μ‚¬μš© 쀑이라고 νŒλ‹¨ν•΄μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(memory leak)κ°€ λ°œμƒν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

엄격(strict) λͺ¨λ“œμ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

JS의 였λ₯˜λ₯Ό 보닀 μ—„κ²©ν•˜κ²Œ κ²€μ‚¬ν•˜λŠ” λͺ¨λ“œλ‘œ 암묡적 λ³€μˆ˜ 선언이 κΈˆμ§€λ˜κ³ ,Β this바인딩이 μ œν•œλ˜λŠ” λ“± μ—¬λŸ¬κ°€μ§€κ°€ μ œν•œλ©λ‹ˆλ‹€.

  • μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. μ›λž˜ 일반 λͺ¨λ“œμ—μ„œλŠ” κ·Έλƒ₯ μ „μ—­ λ³€μˆ˜κ°€ λ˜μ–΄λ²„λ €μ„œ 문제λ₯Ό μ°ΎκΈ° μ–΄λ €μšΈ 수 μžˆμ—ˆμ£ . 또, μ‚­μ œν•  수 μ—†λŠ” ν”„λ‘œνΌν‹°λ₯Ό μ‚­μ œν•˜λ €κ³  ν•  λ•Œλ„ μ—λŸ¬λ₯Ό λƒ…λ‹ˆλ‹€.

일반 ν•¨μˆ˜ λ‚΄μ—μ„œ thisκ°€ μ›λž˜λŠ” μ „μ—­ 객체(λΈŒλΌμš°μ €μ—μ„œλŠ” window)λ₯Ό κ°€λ¦¬μΌ°λŠ”λ°, 엄격 λͺ¨λ“œμ—μ„œλŠ” undefinedλ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•΄μ„œ μ˜λ„μΉ˜ μ•Šμ€ μ „μ—­ μ˜€μ—Όμ„ λ§‰μ•„μ€λ‹ˆλ‹€.

일반 ν•¨μˆ˜μ™€ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ this 바인딩 차이에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

일반 ν•¨μˆ˜

  • 객체의 λ©”μ„œλ“œλ‘œμ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 경우, thisλŠ” ν•΄λ‹Ή 객체(obj)λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • μ΅œμƒλ‹¨μ—μ„œ ν˜ΈμΆœν•  μ‹œμ— thisλŠ” strict modeμ—μ„œλŠ” undefined이고, non-strict modeμ—μ„œλŠ” μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

ν™”μ‚΄ν‘œ ν•¨μˆ˜

  • 자체적인 this 바인딩을 κ°–μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μžμ‹ μ„ 감싼 κ°€μž₯ κ°€κΉŒμš΄ μƒμœ„ μŠ€μ½”ν”„μ˜ this 값을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μƒμ„±μž ν•¨μˆ˜μ˜ κ²½μš°μ—λŠ”, λ―Έλž˜μ— 생성할 μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λ©λ‹ˆλ‹€.

일급 객체의 쑰건에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”
  1. 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€.
  2. λ³€μˆ˜λ‚˜ 자료ꡬ쑰(객체, λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 μžˆλ‹€.
  3. ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달할 수 μžˆλ‹€.
  4. ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
Call By Value, Call By Reference에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

λ„€, Call by Value와 Call by ReferenceλŠ” ν•¨μˆ˜μ— 인자(argument)λ₯Ό 전달할 λ•Œ, κ·Έ 값이 μ–΄λ–»κ²Œ μ „λ‹¬λ˜λŠ”μ§€μ— λŒ€ν•œ λ°©μ‹μ˜ 차이λ₯Ό λ§ν•©λ‹ˆλ‹€.

Call by Value (값에 μ˜ν•œ 호좜)λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μΈμžλ‘œΒ κ°’ 자체의 볡사본을 λ„˜κ²¨μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

  • 주둜 숫자, λ¬Έμžμ—΄, λΆˆλ¦¬μ–Έ κ°™μ€Β μ›μ‹œ νƒ€μž…(Primitive type) 데이터가 이 λ°©μ‹μœΌλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ§€κ°œλ³€μˆ˜(parameter)의 값을 λ³€κ²½ν•˜λ”λΌλ„, ν•¨μˆ˜ μ™ΈλΆ€μ˜ μ›λž˜ λ³€μˆ˜μ—λŠ” μ•„λ¬΄λŸ° 영ν–₯을 μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ ν•¨μˆ˜λŠ” κ°’μ˜ 볡사본을 λ°›μ•„μ„œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

Call by Reference (참쑰에 μ˜ν•œ 호좜)λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 인자둜 값이 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œ(μ°Έμ‘°)λ₯Ό λ„˜κ²¨μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 객체, λ°°μ—΄ 같은 객체 νƒ€μž…(Object type) 데이터가 이 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€κ³  ν”νžˆ μ„€λͺ…ν•©λ‹ˆλ‹€. (μ •ν™•νžˆλŠ” 'Call by Sharing' λ˜λŠ” 'κ°’(μ°Έμ‘°κ°’)에 μ˜ν•œ 호좜'둜 λ³΄λŠ” 것이 더 λ§žμ§€λ§Œ, 결과적으둜 참쑰처럼 λ™μž‘ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.)
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 객체의 속성을 λ³€κ²½ν•˜λ©΄, ν•¨μˆ˜ μ™ΈλΆ€μ˜ μ›λž˜ 객체에도 κ·Έ λ³€κ²½ 사항이 λ°˜μ˜λ©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ˜ λ§€κ°œλ³€μˆ˜μ™€ ν•¨μˆ˜ μ™ΈλΆ€μ˜ λ³€μˆ˜κ°€ 같은 λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— μžˆλŠ” λ™μΌν•œ 객체λ₯Ό 가리킀고 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • μ€‘μš”ν•œ 점은, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό λ„˜κΈΈ λ•ŒΒ ν•¨μˆ˜ μ•ˆμ—μ„œ κ·Έ 객체 자체λ₯Ό λ‹€λ₯Έ 객체둜 μž¬ν• λ‹Ήν•˜λ©΄, 원본 κ°μ²΄λŠ” λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ²˜μŒμ—λŠ” λ§€κ°œλ³€μˆ˜μ™€ 같은 객체λ₯Ό κ°€λ¦¬μΌ°μ§€λ§Œ, ν•¨μˆ˜ μ•ˆμ—μ„œ μƒˆλ‘œμš΄ 객체λ₯Ό ν• λ‹Ήλ°›μœΌλ©΄μ„œ 연결이 λŠμ–΄μ‘ŒκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
call, apply, bind에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

call, apply, bind λͺ¨λ‘ ν•¨μˆ˜μ˜ this 값을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•˜κ³  ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.

  • call: ν•¨μˆ˜μ— 전달할 μΈμžλ“€μ„ κ°œλ³„μ μœΌλ‘œ μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ „λ‹¬ν•˜κ³ , μ¦‰μ‹œ μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • apply: ν•¨μˆ˜μ— 전달할 μΈμžλ“€μ„ λ°°μ—΄ λ˜λŠ” μœ μ‚¬ λ°°μ—΄ 객체 ν˜•νƒœλ‘œ μ „λ‹¬ν•˜κ³ , μ¦‰μ‹œ μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • bind: thisκ°€ 영ꡬ히 λ°”μΈλ”©λœ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

callκ³Ό apply의 μ°¨μ΄λŠ” 인자 전달 방식밖에 μ—†μŒ.

this에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

thisλŠ” μžμ‹ μ΄ μ†ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

this의 값은 ν˜ΈμΆœλ˜λŠ” 방식에 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.

  • μ „μ—­μ—μ„œλŠ”Β window,Β global을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • κ°μ²΄μ—μ„œλŠ” ν•΄λ‹Ή 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • ν΄λž˜μŠ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜(Arrow Function)μ—μ„œλŠ” μƒμœ„ μŠ€μ½”ν”„μ˜Β thisλ₯Ό μƒμ†λ°›μŠ΅λ‹ˆλ‹€.
μ΄ν„°λŸ¬λΈ”κ³Ό μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œ

Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•œ λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ ν”„λ‘œν† νƒ€μž… 체인을 톡해 상속받은 Symbol.iteratorλ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯ΌΒ μ΄ν„°λŸ¬λΈ”이라 ν•©λ‹ˆλ‹€.

μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œ

μ΄ν„°λŸ¬λΈ”μ˜Β Symbol.iteratorΒ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μ΄ν„°λ ˆμ΄ν„°λŠ”Β nextΒ λ©”μ„œλ“œλ₯Ό μ†Œμœ ν•˜λ©°Β nextΒ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©°Β value와 doneΒ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”Β μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯ΌΒ μ΄ν„°λ ˆμ΄ν„°λΌ ν•©λ‹ˆλ‹€.

μ œλ„ˆλ ˆμ΄ν„°μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μ œλ„ˆλ ˆμ΄ν„°λŠ” 반볡 κ°€λŠ₯ν•œ(Iterable) ν•¨μˆ˜λ‘œ, 싀행을 쀑간에 λ©ˆμ·„λ‹€κ°€ λ‹€μ‹œ μ‹œμž‘ν•  수 μžˆλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

function*Β ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ •μ˜ν•˜λ©°,Β yieldΒ ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ,Β yieldν‚€μ›Œλ“œλ₯Ό λ§Œλ‚˜λ©΄ 싀행이 λ©ˆμΆ”κ³ Β next()Β λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ λ‹€μ‹œ 싀행이 μ΄μ–΄μ§‘λ‹ˆλ‹€.

μ œλ„ˆλ ˆμ΄ν„° 객체도 μ΄ν„°λ ˆμ΄ν„°μ΄μž μ΄ν„°λŸ¬λΈ”μž…λ‹ˆλ‹€.

이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±μ΄ 올라갈 수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³  : https://ko.javascript.info/generators

λ³€μˆ˜

var, let, const 차이λ₯Ό μ„€λͺ…ν•΄μ£Όμ„Έμš”

var둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έλ˜κΈ° 전에 접근해도 undefined값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ˜ν•œ ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό κ°–κΈ° λ•Œλ¬Έμ—, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€λ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ 영ν–₯을 λ°›κ³ , ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€λ©΄ μ „μ—­ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•©λ‹ˆλ‹€. λ˜ν•œ, 쀑볡선언과 μž¬ν• λ‹Ήμ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

letμ΄λ‚˜Β const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έλ˜κΈ° 전에 μ ‘κ·Όν•  수 μ—†κ³ , 블둝 μŠ€μ½”ν”„λ₯Ό κ°–κΈ°λ•Œλ¬Έμ—, μ½”λ“œ 블둝 λ‚΄μ—μ„œ μœ νš¨ν•©λ‹ˆλ‹€. 두 경우 λͺ¨λ‘ 쀑볡선언이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ,Β let의 κ²½μš°λŠ” μž¬ν• λ‹Ήμ΄ κ°€λŠ₯ν•˜κ³ Β constλŠ” μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

var

  1. μ„ μ–Έ + μ΄ˆκΈ°ν™” 단계가 μ½”λ“œ μ‹€ν–‰ 전에 λ™μ‹œμ— μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 즉, μŠ€μ½”ν”„ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ ΈΒ undefined둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
  2. λ”°λΌμ„œ μ½”λ“œ μ‹€ν–‰ 쀑 μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜μ— 접근해도 μ—λŸ¬ 없이 undefinedκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.
  3. ν• λ‹Ή λ‹¨κ³„λŠ” μ›λž˜ μ½”λ“œ μœ„μΉ˜μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

let, const

  1. μ„ μ–Έ λ‹¨κ³„λ§Œ μ½”λ“œ μ‹€ν–‰ 전에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. μŠ€μ½”ν”„ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ Έ λ³€μˆ˜ 이름은 λ“±λ‘λ©λ‹ˆλ‹€.
  2. μ›λž˜ μ½”λ“œ μœ„μΉ˜μ— λ„λ‹¬ν–ˆμ„ λ•Œ μ΄ˆκΈ°ν™”μ™€ 할당이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계 사이에 **μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ)**κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. 1. TDZ κ΅¬κ°„μ—μ„œ ν•΄λ‹Ή λ³€μˆ˜μ— μ ‘κ·Όν•˜λ©΄Β ReferenceErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄ˆκΈ°ν™”λ˜κΈ° μ „μ—λŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
TDZ에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

TDZ(Temporal Dead Zone)λŠ” let λ˜λŠ” const둜 μ„ μ–Έλœ λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™”λ˜κΈ° 전에 μ ‘κ·Όν•  수 μ—†λŠ” μ˜μ—­μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

letκ³Ό constλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ˜μ§€λ§Œ μ΄ˆκΈ°ν™”λ˜μ§€λŠ” μ•ŠκΈ°λ•Œλ¬Έμ— TDZ에 λ“€μ–΄κ°‘λ‹ˆλ‹€.

JS의 데이터 νƒ€μž…μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 데이터 νƒ€μž…μ€ μ›μ‹œνƒ€μž…κ³Ό κ°μ²΄νƒ€μž…μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€. μ›μ‹œνƒ€μž…μ€ 값이 λ³€κ²½λ˜μ§€ μ•ŠλŠ” λΆˆλ³€λ°μ΄ν„°μž…λ‹ˆλ‹€. number, boolean, string, undefined, null, bigInt, symbol이 μžˆμŠ΅λ‹ˆλ‹€.

κ°μ²΄νƒ€μž…μ€ λ©”λͺ¨λ¦¬μ— μ£Όμ†Œλ₯Ό μ €μž₯ν•˜μ—¬ λ³€μˆ˜μ— 값을 λ³΅μ‚¬ν•˜λ©΄ μ£Όμ†Œλ§Œ λ³΅μ‚¬λ©λ‹ˆλ‹€. 원본이 λ³€κ²½λ˜λ©΄ μ°Έμ‘°ν•˜κ³  있던 λͺ¨λ“  λ³€μˆ˜μ— μ˜ν•­μ„ μ€λ‹ˆλ‹€.

λ³€μˆ˜ μ„ μ–Έ, μ΄ˆκΈ°ν™”, ν• λ‹Ήμ˜ 차이점에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

λ¨Όμ € 선언은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—κ²Œ 'μ΄μ œλΆ€ν„° 이런 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ² λ‹€'라고 μ•Œλ €μ£ΌλŠ” κ³Όμ •μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄Β let myVar;Β λ‚˜Β const myConst; 처럼 ν‚€μ›Œλ“œ(let,Β const,Β var)와 λ³€μˆ˜ 이름을 μ μ–΄μ„œ λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦¬λŠ” κ±°μ£ . μ΄λ•Œ ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간이 ν™•λ³΄λ©λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ μ΄ˆκΈ°ν™”λŠ” μ΄λ ‡κ²Œ μ„ μ–Έλœ λ³€μˆ˜μ—Β μ²˜μŒμœΌλ‘œ 값을 λ„£μ–΄μ£ΌλŠ” 것을 λ§ν•©λ‹ˆλ‹€. μ„ μ–Έ λ‹¨κ³„μ—μ„œ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간에 μ‹€μ œ 값을 μ—°κ²°ν•˜λŠ” 과정이죠.Β let myVar = 10; 처럼 μ„ μ–Έκ³Ό λ™μ‹œμ— 값을 ν• λ‹Ήν•˜λ©΄, 이게 μ„ μ–Έμ΄μž μ΄ˆκΈ°ν™”κ°€ λ˜λŠ” κ²λ‹ˆλ‹€.Β varλ‚˜Β let의 경우, μ„ μ–Έλ§Œ ν•˜κ³  값을 ν• λ‹Ήν•˜μ§€ μ•ŠμœΌλ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μžλ™μœΌλ‘œΒ undefinedλΌλŠ” κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ€λ‹ˆλ‹€. ν•˜μ§€λ§ŒΒ constλŠ” μ„ μ–Έν•  λ•Œ λ°˜λ“œμ‹œ 값을 ν• λ‹Ήν•΄μ„œ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 할당은 이미 μ„ μ–Έλ˜κ³  (보톡 μ΄ˆκΈ°ν™”κΉŒμ§€ 된) λ³€μˆ˜μ—Β μƒˆλ‘œμš΄ 값을 μ €μž₯ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ•„κΉŒΒ let myVar = 10; 으둜 μ΄ˆκΈ°ν™”ν–ˆλ‹€λ©΄, λ‚˜μ€‘μ— μ½”λ“œμ—μ„œΒ myVar = 20;Β μ΄λ ‡κ²Œ λ‹€λ₯Έ 값을 λ„£λŠ” 것이 λ°”λ‘œ ν• λ‹Ήμž…λ‹ˆλ‹€. 이미 μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜μ— 값을 μ—…λ°μ΄νŠΈν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. λ¬Όλ‘ Β const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•˜μ£ .

null / undefined / NaN 을 λΉ„κ΅ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

undefinedλŠ” λ³€μˆ˜κ°€ 선언은 λ˜μ—ˆμ§€λ§Œ 아직 μ–΄λ–€ 값도 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

null은 κ°œλ°œμžκ°€Β μ˜λ„μ μœΌλ‘œ '값이 μ—†μŒ' λ˜λŠ” 'λΉ„μ–΄ 있음'을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄Β μ‚¬μš©ν•˜λŠ” κ°’μž…λ‹ˆλ‹€.

NaN은 "Not a Number"의 μ•½μžλ‘œ, 숫자 연산을 ν–ˆμ§€λ§Œ κ·Έ κ²°κ³Όκ°€ μœ νš¨ν•œ μˆ«μžκ°€ 아닐 λ•ŒΒ λ‚˜νƒ€λ‚˜λŠ” νŠΉλ³„ν•œ 숫자 κ°’μž…λ‹ˆλ‹€.

얕은 볡사와 κΉŠμ€ 볡사에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

얕은 λ³΅μ‚¬λŠ” κ°μ²΄λ‚˜ λ°°μ—΄μ˜ 1단계 μ†μ„±λ§Œ λ³΅μ‚¬ν•˜κ³ , μ€‘μ²©λœ 값은 μ°Έμ‘°λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€.

κΉŠμ€ λ³΅μ‚¬λŠ” κ°μ²΄λ‚˜ λ°°μ—΄μ˜ λͺ¨λ“  μ†μ„±μ΄λ‚˜ μ›μ†Œλ₯Ό μž¬κ·€μ μœΌλ‘œ λ³΅μ‚¬ν•˜κ³ , μ€‘μ²©λœ κ°μ²΄κΉŒμ§€ λ³΅μ‚¬ν•©λ‹ˆλ‹€.

얕은 비ꡐ와 κΉŠμ€ 비ꡐ에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

얕은 λΉ„κ΅λŠ” 두 κ°μ²΄λ‚˜ λ°°μ—΄μ˜ 참쑰만 λΉ„κ΅ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 값이 같더라도 비ꡐ κ²°κ³Όκ°€ falseκ°€ λ‚˜μ˜¬ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

κΉŠμ€ λΉ„κ΅λŠ” 두 κ°μ²΄λ‚˜ λ°°μ—΄μ˜ λͺ¨λ“  μ†μ„±μ΄λ‚˜ λͺ¨λ“  μ›μ†Œλ₯Ό μž¬κ·€μ μœΌλ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€. 즉, 객체가 μ€‘μ²©λ˜μ–΄ 있으면 κ·Έ λ‚΄λΆ€μ˜ μ†μ„±κΉŒμ§€ λΉ„κ΅ν•˜μ—¬ 두 κ°μ²΄λ‚˜ 배열이 λ™μΌν•œμ§€ ν™•μΈν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μΌμ–΄λ‚˜λŠ” 데이터 ν˜•λ³€ν™˜μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 2κ°€μ§€μ˜ λ°©λ²•μœΌλ‘œ 데이터 ν˜•λ³€ν™˜μ΄ μΌμ–΄λ‚©λ‹ˆλ‹€.

  • 암묡적 λ³€ν™˜ :Β +,Β ,Β ==Β λ“±μ˜ 기호λ₯Ό 톡해 μžλ™μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•©λ‹ˆλ‹€.
  • λ¬΅μ‹œμ  λ³€ν™˜ : String, Number λ“±μœΌλ‘œ 직접 데이터 νƒ€μž…μ„ λ³€ν™˜ν•©λ‹ˆλ‹€.

ν”„λ‘œν† νƒ€μž…

Prototypeκ³Ό Prototype Chainingμ΄λž€?

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  객체듀은 λ©”μ„œλ“œμ™€ 속성듀을 상속받기 μœ„ν•œ ν…œν”Œλ¦ΏμœΌλ‘œμ¨ ν”„λ‘œν† νƒ€μž…μ„ κ°–μŠ΅λ‹ˆλ‹€.

μ •ν™•νžˆ λ§ν•˜μžλ©΄ μƒμ†λ˜λŠ” 속성과 λ©”μ„œλ“œλ“€μ€ 각 객체가 μ•„λ‹ˆλΌ 객체의 μƒμ„±μžμ˜ prototypeμ΄λΌλŠ” 속성에 μ •μ˜λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œν† νƒ€μž… 체인은 κ°μ²΄μ—μ„œ 속성을 찾을 λ•Œ λΆ€λͺ¨μ˜ ν”„λ‘œν† νƒ€μž…μ„ 따라 κ²€μƒ‰ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€. 객체 μΈμŠ€ν„΄μŠ€μ™€ ν”„λ‘œν† νƒ€μž…κ°„μ— 연결이 κ΅¬μ„±λ˜λ©°, 이 연결을 따라 ν”„λ‘œν† νƒ€μž… 체인을 타고 μ˜¬λΌκ°€λ©° 속성과 λ©”μ„œλ“œλ₯Ό νƒμƒ‰ν•˜λŠ” 것이 ν”„λ‘œν† νƒ€μž… μ²΄μ΄λ‹μž…λ‹ˆλ‹€.

ν”„λ‘œν† νƒ€μž…κ³Ό 일반 객체지ν–₯ μ–Έμ–΄μ˜ μ°¨μ΄λŠ”?

ν”„λ‘œν† νƒ€μž… 기반 언어와 객체지ν–₯ μ–Έμ–΄λŠ” λ‹€μ–‘ν•œ λΆ€λΆ„μ—μ„œ 차이가 μžˆμŠ΅λ‹ˆλ‹€.

  • 객체 생성 방식 : ν”„λ‘œν† νƒ€μž…κΈ°λ°˜ μ–Έμ–΄λŠ” κΈ°μ‘΄ 객체λ₯Ό λ³΅μ œν•˜μ—¬ μƒˆ 객체λ₯Ό μƒμ„±ν•˜μ§€λ§Œ, 일반 객체지ν–₯의 경우 클래슀λ₯Ό μ •μ˜ν•œ ν›„ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • 상속 방식 : ν”„λ‘œν† νƒ€μž…κΈ°λ°˜ μ–Έμ–΄λŠ” ν”„λ‘œν† νƒ€μž… 체인을 톡해 상속받고 객체지ν–₯ μ–Έμ–΄λŠ” 클래슀 μƒμ†κ΅¬μ‘°μž…λ‹ˆλ‹€.
  • this 바인딩 : ν”„λ‘œν† νƒ€μž…κΈ°λ°˜ μ–Έμ–΄λŠ” thisκ°€ ν˜ΈμΆœν•˜λŠ” λ¬Έλ§₯에 따라 λ™μ μœΌλ‘œ κ²°μ •λ˜μ§€λ§Œ 객체지ν–₯ μ–Έμ–΄λŠ” κ³ μ •μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
ν”„λ‘œν† νƒ€μž…μ΄ μ‘΄μž¬ν•˜λŠ”λ°, μ™œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 클래슀λ₯Ό λ„μž…ν–ˆμ„κΉŒμš”?

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 클래슀λ₯Ό λ„μž…ν•œ μ—¬λŸ¬ μ΄μœ κ°€ μžˆμŠ΅λ‹ˆλ‹€.

prototype을 직접 λ‹€λ£¨λŠ” 방식이 μ–΄λ ΅κ³  λ³΅μž‘ν–ˆκΈ°μ— λ¬Έλ²•μ˜ 직관성을 올리고 상속을 κ°„κ²°ν™”ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

이λ₯Ό 톡해 μ½”λ“œ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 클래슀λ₯Ό λ„μž…ν–ˆλ‹€ ν•˜λ”λΌλ„ λ‚΄λΆ€ μž‘λ™λ°©μ‹μ€ ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μ‚¬μš©μžμ—κ²Œ νŽΈμ˜μ„±μ„ μ œκ³΅ν•˜κΈ° μœ„ν•œ 문법적 μ„€νƒ•μž…λ‹ˆλ‹€.

μ΅œμƒμœ„ 루트의 ν”„λ‘œν† νƒ€μž…μ€ λ¬΄μ—‡μΈκ°€μš”?

μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œν† νƒ€μž… 체인의 κ°€μž₯ κΌ­λŒ€κΈ°, μ¦‰Β μ΅œμƒμœ„ 루트 ν”„λ‘œν† νƒ€μž… κ°μ²΄λŠ”Β Object.prototypeΒ  μž…λ‹ˆλ‹€.

거의 λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” (직접적이든 간접적이든) 이 Object.prototype 객체λ₯Ό ν”„λ‘œν† νƒ€μž… 체인의 μ–΄λ”˜κ°€μ—μ„œ μƒμ†λ°›κ²Œ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μš°λ¦¬κ°€Β {}Β λ¦¬ν„°λŸ΄λ‘œ λ§Œλ“œλŠ” 일반 κ°μ²΄λ‚˜,Β new Array()둜 λ§Œλ“œλŠ” λ°°μ—΄ 객체, 심지어 ν•¨μˆ˜ κ°μ²΄κΉŒμ§€λ„ κ²°κ΅­μ—λŠ” 이 Object.prototypeΒ  으둜 μ—°κ²°λ©λ‹ˆλ‹€.

Object.prototypeΒ  μ—λŠ”Β toString(),Β hasOwnProperty(),Β valueOf()Β  와 같이 λͺ¨λ“  객체가 기본적으둜 μ‚¬μš©ν•  수 μžˆλŠ” 곡톡 λ©”μ†Œλ“œλ“€μ΄ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

그리고 이 Object.prototype 객체의 ν”„λ‘œν† νƒ€μž…, 즉 Object.getPrototypeOf(Object.prototype)Β  을 확인해보면 nullΒ  이 λ‚˜μ˜΅λ‹ˆλ‹€. 이 null 값이 λ°”λ‘œ ν”„λ‘œν† νƒ€μž… μ²΄μΈμ˜Β μ’…μ°©μ μ„ μ˜λ―Έν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ 더 이상 올라갈 곳이 μ—†λ‹€λŠ” 뜻이죠.

이벀트

이벀트 버블링, 이벀트 캑쳐링, 이벀트 μ „νŒŒμ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

이벀트 μ „νŒŒλŠ” μ›Ή λΈŒλΌμš°μ €μ—μ„œ HTML μš”μ†Œμ— μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ, κ·Έ μ΄λ²€νŠΈκ°€ DOM 트리λ₯Ό 따라 μ–΄λ–»κ²Œ μ „λ‹¬λ˜λŠ”μ§€μ— λŒ€ν•œ λ°©μ‹μž…λ‹ˆλ‹€.

이벀트 버블링은 μ΄λ²€νŠΈκ°€ λ°œμƒν•œ νƒ€κ²Ÿμ—μ„œ μ‹œμž‘ν•΄ λΆ€λͺ¨ μš”μ†Œλ“€μ„ 거쳐 μ΅œμƒμœ„ λ£¨νŠΈκΉŒμ§€ μ „νŒŒλ˜λŠ” ν˜„μƒμž…λ‹ˆλ‹€. λ˜ν•œ κ΄€λ ¨λœ κ°œλ…μœΌλ‘œ 이벀트 캑쳐링과 이벀트 μœ„μž„μ΄ μžˆμŠ΅λ‹ˆλ‹€.

이벀트 캑쳐링은 이벀트 버블링과 λ°˜λŒ€λ‘œ μ΅œμƒμœ„ λ£¨νŠΈμ—μ„œ λ°œμƒν•œ μš”μ†Œκ°€ μ΄λ²€νŠΈκ°€ μ‹€μ œλ‘œ λ°œμƒν•œ νƒ€κ²Ÿ μš”μ†ŒκΉŒμ§€ μ•„λž˜λ‘œ 이벀트λ₯Ό 전달해 λ‚΄λ €κ°€λŠ” ν˜„μƒμ„ λ§ν•©λ‹ˆλ‹€.

μš°λ¦¬κ°€ 보톡 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ‚¬μš©ν•  λ•Œ λ³„λ„μ˜ μ˜΅μ…˜μ„ μ£Όμ§€ μ•ŠμœΌλ©΄, 이벀트 λ¦¬μŠ€λ„ˆλŠ” 이 버블링 λ‹¨κ³„μ—μ„œ λ™μž‘ν•©λ‹ˆλ‹€. 이 버블링 νŠΉμ„± λ•Œλ¬Έμ— 이벀트 μœ„μž„(event delegation)μ΄λΌλŠ” 기법을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이벀트 μœ„μž„μ€ 이벀트 버블링 기법을 μ‚¬μš©ν•΄ μ—¬λŸ¬ li듀에 각각 이벀트λ₯Ό μœ„μž„ν•˜λŠ” 것이 μ•„λ‹Œ ulνƒœκ·Έμ— 이벀트λ₯Ό μœ„μž„ν•΄ ν•˜μœ„ μš”μ†Œλ“€μ—μ„œ 이벀트λ₯Ό λ°œμƒν•  수 μžˆλ„λ‘ ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.

이벀트 μ „νŒŒ μ œμ–΄

stopPropagation : 이벀트의 μ „νŒŒλ₯Ό μ°¨λ‹¨ν•˜μ—¬ λ²„λΈ”λ§μ΄λ‚˜ μΊ‘μ²˜λ§μ„ 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

preventDefault : 이벀트의 κΈ°λ³Έ λ™μž‘μ„ μ·¨μ†Œν•©λ‹ˆλ‹€. λ²„λΈ”λ§μ΄λ‚˜ μΊ‘μ²˜λ§μ€ 막을 수 μ—†μŠ΅λ‹ˆλ‹€.

event.target과 event.currentTarget의 차이

event.target은 μ΄λ²€νŠΈκ°€ μ‹€μ œλ‘œ λ°œμƒν•œ DOM μš”μ†Œλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

event.currentTarget은 이벀트 λ¦¬μŠ€λ„ˆκ°€ μ‹€μ œλ‘œ λ“±λ‘λœ DOM μš”μ†Œλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

비동기 처리 방식

동기(sync)와 비동기(async)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

동기 방식은 순차적으둜 μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 즉, 이전 μž‘μ—…μ΄ λλ‚˜μ•Ό λ‹€μŒ μž‘μ—…μ΄ μ‹€ν–‰λ©λ‹ˆλ‹€.

비동기 방식은 νŠΉμ • μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³ , λ‹€μŒ μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

이벀트 루프에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 비동기 처리 λ§€μ»€λ‹ˆμ¦˜μ„ κ΄€λ¦¬ν•˜λŠ” 핡심 ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ 기반으둜 λ™μž‘ν•˜μ§€λ§Œ, 비동기 μž‘μ—…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 이벀트 루프λ₯Ό 톡해 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

  1. 콜 μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ 확인
  2. λΉ„μ–΄μžˆμœΌλ©΄ νƒœμŠ€ν¬ 큐에 μžˆλŠ” μž‘μ—…μ„ μŠ€νƒμœΌλ‘œ 가져와 μ‹€ν–‰ (마이크둜 νƒœμŠ€ν¬ 큐, 맀크둜 νƒœμŠ€ν¬ 큐가 μžˆλŠ”λ° 마이크둜 νƒœμŠ€ν¬ νλŠ” Promise, async/await 등을 μ²˜λ¦¬ν•˜κ³  맀크둜 νƒœμŠ€ν¬ νλŠ” setInterval, setTimeout 등을 μ²˜λ¦¬ν•©λ‹ˆλ‹€. λ˜ν•œ 마이크둜 νƒœμŠ€ν¬ 큐가 μš°μ„ μˆœμœ„κ°€ 더 λ†’μŠ΅λ‹ˆλ‹€.)
  3. 이λ₯Ό λ¬΄ν•œνžˆ 반볡

+) μžλ°”μŠ€ν¬λ¦½νŠΈ μžμ²΄λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그런데 비동기 μž‘μ—…μ΄ κ°€λŠ₯ν•œ μ΄μœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 λ‘˜λŸ¬μ‹Ό λŸ°νƒ€μž„ ν™˜κ²½(λΈŒλΌμš°μ € λ˜λŠ” Node.js) λ•λΆ„μž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 비동기 둜직이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

JSμ—μ„œ 비동기 λ™μž‘μ΄ κ°€λŠ₯ν•œ μ΄μœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 이벀트 λ£¨ν”„λ•Œλ¬Έμž…λ‹ˆλ‹€.

이벀트 λ£¨ν”„λŠ” 호좜 μŠ€νƒ 내뢀에 μˆ˜ν–‰ν•΄μ•Ό ν•  μž‘μ—…μ΄ μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , μˆ˜ν–‰ν•΄μ•Ό ν•  μ½”λ“œκ°€ μžˆλ‹€λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 μ΄μš©ν•΄ μ‹€ν–‰ν•˜κ²Œ ν•©λ‹ˆλ‹€.

λ˜ν•œ, νƒœμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ λ°˜λ³΅ν•΄μ„œ ν™•μΈν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 비동기 μž‘μ—…μ„ λˆ„κ°€ μˆ˜ν–‰ν•˜λŠλƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ€ λ©”μΈμŠ€λ ˆλ“œκ°€ μ•„λ‹ˆλΌ νƒœμŠ€ν¬ 큐에 ν• λ‹Ήλ˜λŠ” λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. 이 λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ νƒœμŠ€ν¬ 큐에 μž‘μ—…μ„ ν• λ‹Ήν•΄ μ²˜λ¦¬ν•˜λŠ” 것은 λΈŒλΌμš°μ €λ‚˜ Node.js의 μ—­ν• μž…λ‹ˆλ‹€.

즉, μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ 싀행은 μ‹±κΈ€ μŠ€λ ˆλ“œμ—μ„œ μ΄λ£¨μ–΄μ§€μ§€λ§Œ μ΄λŸ¬ν•œ μ™ΈλΆ€ Web 등은 λͺ¨λ‘ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ μ™ΈλΆ€μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것 처럼보이고 비동기가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

더 μžμ„Έν•œ 이벀트 루프 λ™μž‘

이벀트 λ£¨ν”„λŠ” μ½œμŠ€νƒμ„ λ¨Όμ € ν™•μΈν•œ 후에 마이크둜 νƒœμŠ€ν¬ 큐λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ 마이크둜 νƒœμŠ€ν¬ 큐에도 데이터가 μ—†λ‹€λ©΄ νƒœμŠ€ν¬ 큐λ₯Ό λ§ˆμ§€λ§‰μœΌλ‘œ ν™•μΈν•©λ‹ˆλ‹€.

λ˜ν•œ, λ Œλ”λ§μ€Β λ§ˆμ΄ν¬λ‘œ νƒœμŠ€ν¬ 큐가 μ‹€ν–‰λ˜λ©΄ μΌμ–΄λ‚˜κ²Œ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ 마이크둜 νƒœμŠ€ν¬ 큐λ₯Ό 거치고 λ Œλ”λ§μ„ 거쳐 νƒœμŠ€ν¬ 큐λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

콜백 ν•¨μˆ˜μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 λ„˜κ²¨μ§€λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

즉, μ–΄λ–€ ν•¨μˆ˜κ°€ μ‹€ν–‰λœ 후에 ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

콜백 μ§€μ˜₯을 ν•΄κ²°ν•˜λŠ” 방법을 μ„€λͺ…ν•΄μ£Όμ„Έμš”

JavaScript μ½”λ“œμ—μ„œ μ—¬λŸ¬ 비동기 μž‘μ—…μ΄ 순차적으둜 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  λ•Œ, 각각의 μž‘μ—…μ΄ μ™„λ£Œλœ ν›„ λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 콜백 내뢀에 μ½œλ°±μ„ μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. 이둜 인해 μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κ³  디버깅이 μ–΄λ €μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Promiseλ‚˜ async/await을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ°Έκ³  : https://developer-haru.tistory.com/57

Promise/then 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

PromiseλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 비동기 μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있게 ν•΄μ£ΌλŠ” κ°μ²΄μž…λ‹ˆλ‹€. fulfilled, pending, rejected μ„Έκ°€μ§€μ˜ μƒνƒœλ₯Ό κ°€μ§‘λ‹ˆλ‹€.

비동기 μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆμ„ λ•Œ promise κ°μ²΄λŠ” resolveλ₯Ό λ°˜ν™˜ν•˜κ²Œ 되고, then을 톡해 μ½œλ°±ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™λ©λ‹ˆλ‹€.

콜백의 쀑첩 λŒ€μ‹ μ—, then/catch 체인을 ν†΅ν•΄μ„œ 가독성 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

async/await 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

async/await은 Promiseλ₯Ό 기반으둜 ν•œ λ¬Έλ²•μœΌλ‘œ, 비동기 μž‘μ—…μ„ 동기 μ½”λ“œμ²˜λŸΌ μž‘μ„±ν•  수 있게 ν•΄μ£ΌλŠ” λ¬Έλ²•μž…λ‹ˆλ‹€.

.then 체인을 ν”Όν•  수 μžˆμ–΄ 더 가독성이 μ’‹μŠ΅λ‹ˆλ‹€.

λ˜ν•œ try/catch 문을 톡해 비동기 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ°œμƒν•œ μ—λŸ¬λ₯Ό 동기 μ½”λ“œμ²˜λŸΌ μ²˜λ¦¬ν•  수 μžˆμ–΄μ„œ μ—λŸ¬ 핸듀링도 훨씬 λͺ…ν™•ν•΄μ§‘λ‹ˆλ‹€.

Promise.all()κ³Ό Promise.race()에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”

Promise.all()

  • Promise.all()은 μ—¬λŸ¬ 개의 ν”„λ‘œλ―ΈμŠ€λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜κ³ , λͺ¨λ“  ν”„λ‘œλ―ΈμŠ€κ°€ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦° 후에 ν•˜λ‚˜μ˜ κ²°κ³Ό 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • λͺ¨λ“  ν”„λ‘œλ―ΈμŠ€κ°€ μ„±κ³΅ν•˜λ©΄, λ°°μ—΄μ˜ μˆœμ„œλŠ” 각 ν”„λ‘œλ―ΈμŠ€κ°€ μ‹œμž‘λœ μˆœμ„œλŒ€λ‘œ κ²°κ³Όκ°€ λ“€μ–΄κ°‘λ‹ˆλ‹€.
  • ν•˜λ‚˜μ˜ ν”„λ‘œλ―ΈμŠ€λΌλ„ μ‹€νŒ¨ν•˜λ©΄, Promise.all()은 ν•΄λ‹Ή μ‹€νŒ¨ ν”„λ‘œλ―ΈμŠ€μ˜ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•˜λ©° μ¦‰μ‹œ μ€‘λ‹¨λ©λ‹ˆλ‹€.

Promise.race()

  • Promise.race()λŠ” μ—¬λŸ¬ 개의 ν”„λ‘œλ―ΈμŠ€ 쀑 κ°€μž₯ λ¨Όμ € μ™„λ£Œλœ ν•˜λ‚˜μ˜ ν”„λ‘œλ―ΈμŠ€λ§Œμ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 즉, κ°€μž₯ λ¨Όμ € 성곡 λ˜λŠ” μ‹€νŒ¨ν•œ ν”„λ‘œλ―ΈμŠ€μ˜ κ²°κ³Όλ‚˜ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•˜λ©°, λ‹€λ₯Έ ν”„λ‘œλ―ΈμŠ€λ“€μ€ λ¬΄μ‹œλ©λ‹ˆλ‹€.

Babel, Webpack

Babelκ³Ό 같은 트랜슀파일러(Transpiler)의 역할은 λ¬΄μ—‡μΈκ°€μš”? μ™œ ν˜„λŒ€ ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ—μ„œ ν•„μš”ν•œκ°€μš”?

λ°”λ²¨μ˜ 핡심 역할은 μ΅œμ‹  λ²„μ „μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ(ES6, ESNext λ“±) λ¬Έλ²•μœΌλ‘œ μž‘μ„±λœ μ½”λ“œλ₯Ό κ΅¬ν˜• λΈŒλΌμš°μ €μ—μ„œλ„ λ¬Έμ œμ—†μ΄ λ™μž‘ν•  수 μžˆλ„λ‘ 이전 λ²„μ „μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ(주둜 ES5) λ¬Έλ²•μœΌλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

바벨은 μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ κΈ°μˆ μ„ μ‚¬μš©ν•˜λ €λŠ” 개발자의 μš”κ΅¬μ™€ λ‹€μ–‘ν•œ λΈŒλΌμš°μ € ν™˜κ²½μ„ 지원해야 ν•˜λŠ” ν˜„μ‹€ μ‚¬μ΄μ˜Β κ°„κ·Ήμ„ λ©”μ›Œμ£ΌλŠ” ν•„μˆ˜μ μΈ 도ꡬ라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 덕뢄에 더 λ‚˜μ€ μ½”λ“œλ‘œ 더 λ§Žμ€ μ‚¬μš©μžμ—κ²Œ μ•ˆμ •μ μΈ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•  수 있게 λ©λ‹ˆλ‹€.

μ›ΉνŒ©(Webpack), Vite와 같은 λͺ¨λ“ˆ λ²ˆλ“€λŸ¬(Module Bundler)λŠ” μ™œ ν•„μš”ν•˜λ©°, μ£Όμš” κΈ°λŠ₯은 λ¬΄μ—‡μΈκ°€μš”?

λͺ¨λ“ˆ λ²ˆλ“€λŸ¬λŠ” μ—¬λŸ¬ 개둜 λ‚˜λ‰˜μ–΄μ§„ μ½”λ“œ 파일(μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆλΏλ§Œ μ•„λ‹ˆλΌ CSS, 이미지 λ“± λ‹€λ₯Έ λ¦¬μ†ŒμŠ€ 포함)κ³Ό κ·Έ μ˜μ‘΄μ„±μ„ λΆ„μ„ν•΄μ„œ, λΈŒλΌμš°μ €κ°€ 효율적으둜 λ‘œλ“œν•˜κ³  μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•˜λ‚˜ λ˜λŠ” λͺ‡ 개의 μ΅œμ ν™”λœ λ²ˆλ“€λ‘œ λ¬Άμ–΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

Babel을 ν†΅ν•œ 트랜슀파일링, μ½”λ“œ μ••μΆ•κ³Ό 트리 쉐이킹을 ν†΅ν•œ μ΅œμ ν™”, HMR을 ν†΅ν•œ 개발 생산성 ν–₯상과 같은 κΈ°λŠ₯을 톡해 ν˜„λŒ€ ν”„λ‘ νŠΈμ—”λ“œ 개발의 ν•„μˆ˜μ μΈ λ„κ΅¬λ‘œ 자리작고 μžˆμŠ΅λ‹ˆλ‹€.

require vs import λ₯Ό λΉ„κ΅ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

requireλŠ” 동적 λͺ¨λ“ˆλ‘œ μ‹€ν–‰λ˜λŠ” μˆœκ°„μ— λ°”λ‘œ 뢈러였게 되며

importλŠ” 정적 λͺ¨λ“ˆλ‘œ λΉŒλ“œ νƒ€μž„μ— λΆ„μ„λ˜λ©° νŠΈλ¦¬μ…°μ΄ν‚Ήμ΄ κ°€λŠ₯ν•΄ μ΅œμ ν™”μ— μœ λ¦¬ν•©λ‹ˆλ‹€.

ν•¨μˆ˜

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ™€ 일반 ν•¨μˆ˜μ˜ 차이

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜μ™€ λͺ‡κ°€μ§€ λ‹€λ₯Έ 점이 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ 핡심적인 μ°¨μ΄λŠ” this의 처리 λ°©μ‹μž…λ‹ˆλ‹€. 일반 ν•¨μˆ˜λŠ” 호좜 μ‹œμ μ—μ„œ this의 값이 κ²°μ •λ˜λŠ” 반면, ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μžμ‹ μ„ κ°μ‹ΈλŠ” μ™ΈλΆ€ μŠ€μ½”ν”„(μƒμœ„ μŠ€μ½”ν”„)의 this 값을 κ·ΈλŒ€λ‘œ λ¬Όλ €λ°›κ³  κ³ μ •μ‹œν‚€κΈ° λ•Œλ¬Έμ— ν•œλ²ˆ μ •ν•΄μ§€κ³  λ‚˜λ©΄ λ°”λ€Œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

두 번째둜 ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ 비ꡐ적 κ°„κ²°ν•œ 문법을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ„Έ 번째둜 ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŠ΅λ‹ˆλ‹€. prototype ν”„λ‘œνΌν‹°λ„ μ—†κ³  ν”„λ‘œν† νƒ€μž…λ„ μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 ν•¨μˆ˜ 자체의 this, arguments, super, new.target 바인딩을 κ°–μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μœ„μ˜ λ‚΄μš©μ„ μ°Έμ‘°ν•˜λ©΄ μƒμœ„ μŠ€μ½”ν”„μ˜ λ‚΄μš©μ„ μ°Έμ‘°ν•©λ‹ˆλ‹€. 즉, 바인딩을 μƒμœ„ μŠ€μ½”ν”„μ— κ³ μ •μ‹œν‚΅λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έν˜•κ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 차이

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ…μ—μ„œ 차이가 λ‚©λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬Έμ˜ 경우 ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ—¬ μ‹€μ œ μ½”λ“œ 라인 이전에 ν˜ΈμΆœν•˜μ—¬λ„ 정상적인 값을 λ°˜ν™˜ν•˜λŠ” 반면, ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ κ²½μš°λŠ” μ‹€μ œ μ½”λ“œ 라인 이전에 ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(IIFE)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 말 κ·ΈλŒ€λ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  κ·Έ μˆœκ°„ μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 단 ν•œ 번만 호좜되고, λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ™ΈλΆ€ μŠ€μ½”ν”„μ— 영ν–₯을 λ°›μ§€ μ•Šμ•„ 데이터λ₯Ό λ³΄ν˜Έν•˜κ³  은닉이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ, ν•œ 번 μ‹€ν–‰λ˜λ©΄ λ©”λͺ¨λ¦¬κ°€ 남지 μ•Šμ•„ μΌμ‹œμ μΈ 데이터 μ²˜λ¦¬μ— μ ν•©ν•©λ‹ˆλ‹€.

컀링(Currying)에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

컀링은 μ—¬λŸ¬ 개의 인자λ₯Ό λ°›λŠ” ν•¨μˆ˜λ₯Ό, ν•˜λ‚˜μ˜ 인자만 λ°›λŠ” μ—¬λŸ¬ 개의 ν•¨μˆ˜λ‘œ 순차적으둜 μͺΌκ°œλŠ” ν•¨μˆ˜ λ³€ν™˜ κΈ°λ²•μž…λ‹ˆλ‹€.

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ λͺ¨λ“  인자λ₯Ό ν•œ λ²ˆμ— λ‹€ λ„˜κ²¨μ•Ό ν•˜λŠ” λŒ€μ‹ , 인자λ₯Ό ν•˜λ‚˜μ”© ν˜Ήμ€ λΆ€λΆ„μ μœΌλ‘œ λ„˜κΈΈ 수 있게 λ§Œλ“œλŠ” κ±°μ£ .

예λ₯Ό λ“€μ–΄, 두 숫자λ₯Ό λ”ν•˜λŠ” add(a, b) λΌλŠ” ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄, 이걸 μ»€λ§ν•˜λ©΄ curriedAdd(a) 처럼 첫 번째 인자만 λ°›λŠ” ν•¨μˆ˜λ₯Ό λ¨Όμ € ν˜ΈμΆœν•˜κ³ , 이 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λŠ” 또 λ‹€λ₯Έ ν•¨μˆ˜μ— 두 번째 인자 bλ₯Ό λ„˜κ²¨μ„œ curriedAdd(a)(b) 와 같은 ν˜•νƒœλ‘œ μ΅œμ’… κ²°κ³Όλ₯Ό μ–»λŠ” λ°©μ‹μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

컀링을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜μ˜Β μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 문법

ES6에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

ES6λŠ” ECMAScript 2015의 λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ, μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄μ˜ μ•„μ£Ό 큰 λ³€ν™”μ΄μž μ€‘μš”ν•œ μ—…λ°μ΄νŠΈ 버전이라고 μƒκ°ν•©λ‹ˆλ‹€.

letκ³Ό const의 λ„μž…λΆ€ν„°, ν™”μ‚΄ν‘œ ν•¨μˆ˜ 및 λͺ¨λ“ˆ μ‹œμŠ€ν…œ 등이 μΆ”κ°€λ˜μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό κ°•λ ₯ν•˜κ³ , μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ–Έμ–΄λ‘œ λ§Œλ“€μ–΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

Rest μ—°μ‚°μžμ™€ Spread μ—°μ‚°μžμ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

Rest μ—°μ‚°μžλŠ” μ—¬λŸ¬ 개의 인수λ₯Ό ν•˜λ‚˜λ‘œ 받을 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 즉, μ—¬λŸ¬κ°œμ˜ 값을 ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ λͺ¨μ•„μ€λ‹ˆλ‹€.

Spread μ—°μ‚°μžλŠ” λ°°μ—΄μ΄λ‚˜ 객체의 μš”μ†Œλ₯Ό 펼칠 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

**μ˜΅μ…”λ„ 체이닝(Optional Chaining)Β `?.`Β κ³Ό Nullish CoalescingΒ `??`Β μ—°μ‚°μžλŠ” 무엇이며, μ–΄λ–€ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ  수 μžˆλ‚˜μš”?**

μ˜΅μ…”λ„ 체이닝 (Optional Chaining, ?.)

객체의 μ†μ„±μ΄λ‚˜ λ©”μ†Œλ“œ, λ˜λŠ” λ°°μ—΄μ˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ, μ ‘κ·Όν•˜λ €λŠ” λŒ€μƒμ˜ μ•žλΆ€λΆ„(.Β μ΄λ‚˜Β [Β λ°”λ‘œ μ•ž)이 nullΒ μ΄λ‚˜Β undefined 인지 λ¨Όμ € ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ κ·Έλ ‡λ‹€λ©΄, μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λŠ” λŒ€μ‹ Β μ¦‰μ‹œ 평가λ₯Ό λ©ˆμΆ”κ³ Β undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

κΉŠμˆ™ν•˜κ²Œ μ€‘μ²©λœ 객체 κ΅¬μ‘°μ—μ„œ νŠΉμ • 속성에 μ ‘κ·Όν•΄μ•Ό ν•  λ•Œ μ•„μ£Ό μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ user.profile.address.street 처럼 κΉŠμˆ™μ΄ λ“€μ–΄κ°€μ•Ό ν•˜λŠ”λ°, μ€‘κ°„μ˜ user, profile, address 쀑 μ–΄λŠ ν•˜λ‚˜λΌλ„ nullμ΄λ‚˜ undefined일 κ°€λŠ₯성이 μžˆλ‹€λ©΄ μ˜ˆμ „μ—λŠ” ifλ¬Έμ΄λ‚˜ && μ—°μ‚°μžλ‘œ 길게 체크해야 ν–ˆμŠ΅λ‹ˆλ‹€. μ˜΅μ…”λ„ 체이닝을 μ“°λ©΄ user?.profile?.address?.street μ΄λ ‡κ²Œ ν•œ μ€„λ‘œ μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€

Nullish 병합 μ—°μ‚°μž (Nullish Coalescing Operator, ??)

μ™Όμͺ½ ν”Όμ—°μ‚°μžκ°€Β nullΒ λ˜λŠ”Β undefined 일 λ•Œλ§Œ 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•˜κ³ , κ·Έ μ™Έμ˜ λͺ¨λ“  κ²½μš°μ—λŠ” μ™Όμͺ½ ν”Όμ—°μ‚°μž 값을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ³€μˆ˜μ— 기본값을 섀정해쀄 λ•Œ μ•„μ£Ό μœ μš©ν•©λ‹ˆλ‹€. κΈ°μ‘΄μ—λŠ” 논리 OR μ—°μ‚°μž(||)λ₯Ό 많이 μ‚¬μš©ν–ˆλŠ”λ°, ||λŠ” μ™Όμͺ½ 값이 'falsy'ν•œ κ°’(예: 0, ''(빈 λ¬Έμžμ—΄), false, NaN)이면 무쑰건 였λ₯Έμͺ½ 값을 λ°˜ν™˜ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ–΄μ„œ 이λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

JS의 Array.flat()을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄λ³Ό 수 μžˆμ„κΉŒμš”?

flat()은 μ€‘μ²©λœ 배열을 μ§€μ •λœ 깊이(depth)κΉŒμ§€ ν‰νƒ„ν™”ν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•˜λŠ” 역할을 ν•˜μ£ . κ°€μž₯ 직관적인 방법은 μž¬κ·€λ₯Ό μ΄μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  1. μƒˆλ‘œμš΄ 빈 λ°°μ—΄Β resultλ₯Ό λ§Œλ“­λ‹ˆλ‹€. (원본 λ°°μ—΄ λΆˆλ³€μ„± μœ μ§€)
  2. μž…λ ₯ λ°°μ—΄Β arr의 각 μš”μ†ŒΒ elementλ₯Ό μˆœνšŒν•©λ‹ˆλ‹€.
  3. elementκ°€ 배열이고 depthκ°€ 0보닀 크면,Β element에 λŒ€ν•΄Β customFlat을 μž¬κ·€μ μœΌλ‘œ ν˜ΈμΆœν•˜κ³ (depthλŠ” 1 κ°μ†Œ), κ·Έ κ²°κ³Όλ₯ΌΒ result에 νŽΌμ³μ„œ μΆ”κ°€ν•©λ‹ˆλ‹€.
  4. elementκ°€ 배열이 μ•„λ‹ˆκ±°λ‚˜Β depthκ°€ 0이면,Β elementλ₯Ό κ·ΈλŒ€λ‘œΒ result에 μΆ”κ°€ν•©λ‹ˆλ‹€.
  5. λͺ¨λ“  μš”μ†Œ μˆœνšŒκ°€ λλ‚˜λ©΄Β result 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν•˜λ‚˜μš”?

λΆˆλ³€μ„±μ€ 데이터(주둜 κ°μ²΄λ‚˜ λ°°μ—΄)κ°€ μƒμ„±λœ 후에 κ·Έ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. λ§Œμ•½ 변경이 ν•„μš”ν•˜λ‹€λ©΄, 원본을 μˆ˜μ •ν•˜λŠ” λŒ€μ‹  λ³€κ²½ 사항이 적용된 μƒˆλ‘œμš΄ κ°μ²΄λ‚˜ 배열을 λ§Œλ“œλŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€.

λΆˆλ³€μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•œ λͺ‡κ°€μ§€ 방법이 μžˆμŠ΅λ‹ˆλ‹€.

첫 번째둜, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ›μ‹œ νƒ€μž…μ˜ 경우 κ·Έ 자체둜 λΆˆλ³€μ„±μ„ κ°–κ³  μžˆμœΌλ―€λ‘œ μ›μ‹œνƒ€μž…μœΌλ‘œ 값을 ν• λ‹Ήν•©λ‹ˆλ‹€.

두 번째둜, 가변적인 데이터인 λ°°μ—΄κ³Ό κ°μ²΄λŠ” μƒˆλ‘œμš΄ λ°°μ—΄, 객체λ₯Ό μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€. ν˜Ήμ€, Object.freeze()λ₯Ό ν™œμš©ν•˜μ—¬ 객체λ₯Ό λΆˆλ³€ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ„±λŠ₯ μ΅œμ ν™”

requestAnimationFrame에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λ˜λ©°, λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

λΈŒλΌμš°μ €μ˜ λ””μŠ€ν”Œλ ˆμ΄ λ¦¬ν”„λ ˆμ‹œ μ£ΌκΈ°(1μ΄ˆμ— 60번, 60Hz)에 맞게 λ™κΈ°ν™”λ˜μ–΄ ν˜ΈμΆœλ©λ‹ˆλ‹€. μ΄λŠ” λ§€ ν”„λ ˆμž„λ§ˆλ‹€ ν•œ λ²ˆμ”© μ‹€ν–‰ν•˜κ²Œ λ˜μ–΄ λ§€λ„λŸ½κ³  λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

λ˜ν•œ, λΈŒλΌμš°μ €λŠ” 화면이 λ¦¬ν”„λ ˆμ‹œλ  λ•Œλ§Œ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ μ‚¬μš©μžκ°€ λ‹€λ₯Έ νƒ­μœΌλ‘œ μ „ν™˜ν•˜κ±°λ‚˜, νŽ˜μ΄μ§€κ°€ λ°±κ·ΈλΌμš΄λ“œμ— μžˆμ„ 경우 λΆˆν•„μš”ν•œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©°, 이둜 인해 λΆˆν•„μš”ν•œ CPU λ¦¬μ†ŒμŠ€λ₯Ό μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

**μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…(Code Splitting)κ³Ό μ§€μ—° λ‘œλ”©(Lazy Loading)은 무엇이며, μ›Ή μ„±λŠ₯ μ΅œμ ν™”μ— μ–΄λ–»κ²Œ κΈ°μ—¬ν•˜λ‚˜μš”?**

μ½”λ“œ μŠ€ν”Œλ¦¬νŒ… (Code Splitting)

  • λ¬΄μ—‡μΈκ°€μš”? 말 κ·ΈλŒ€λ‘œΒ μ½”λ“œ(주둜 μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€)λ₯Ό μ—¬λŸ¬ 개의 μž‘μ€ 쑰각(chunk)으둜 λ‚˜λˆ„λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ›ΉνŒ©(Webpack), Vite, Rollup 같은 λͺ¨λ“ˆ λ²ˆλ“€λŸ¬κ°€ μ œκ³΅ν•˜λŠ” μ£Όμš” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
  • μ™œ ν•„μš”ν•œκ°€μš”?Β ν˜„λŒ€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ κΈ°λŠ₯이 λ§Žμ•„μ§€λ©΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€ 파일의 크기가 맀우 μ»€μ§€λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€. 이 큰 νŒŒμΌμ„ ν•œ λ²ˆμ— λ‹€ λ‘œλ“œν•˜λ €κ³  ν•˜λ©΄ 초기 λ‘œλ”© μ‹œκ°„μ΄ κΈΈμ–΄μ Έμ„œ μ‚¬μš©μž κ²½ν—˜μ΄ λ‚˜λΉ μ§‘λ‹ˆλ‹€. μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…μ€ 이 큰 λ²ˆλ“€μ„ μ—¬λŸ¬ 개의 μž‘μ€ 파일둜 λΆ„λ¦¬ν•΄μ„œ,Β μ²˜μŒμ—λŠ” κΌ­ ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ μ½”λ“œλ§Œ λ‘œλ“œν•˜κ³  λ‚˜λ¨Έμ§€λŠ” ν•„μš”ν•  λ•Œ λ‘œλ“œν•˜λ„λ‘ λ§Œλ“œλŠ” κΈ°λ°˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

μ§€μ—° λ‘œλ”© (Lazy Loading)

  • λ¬΄μ—‡μΈκ°€μš”?Β λ¦¬μ†ŒμŠ€λ₯Ό λ‹Ήμž₯ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©΄ λ‘œλ“œν•˜μ§€ μ•Šκ³ , μ‹€μ œλ‘œ ν•„μš”ν•œ μ‹œμ μ— λ‘œλ“œν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ λ¦¬μ†ŒμŠ€λŠ” μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…μœΌλ‘œ λ‚˜λˆ μ§„ μžλ°”μŠ€ν¬λ¦½νŠΈ 청크 파일일 μˆ˜λ„ 있고, μ΄λ―Έμ§€λ‚˜ μ»΄ν¬λ„ŒνŠΈ λ“± λ‹€λ₯Έ μžμ›μΌ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
  • μ™œ ν•„μš”ν•œκ°€μš”?Β μ›Ή νŽ˜μ΄μ§€λ₯Ό 처음 μ—΄ λ•Œ μ‚¬μš©μžκ°€ μ¦‰μ‹œ λ³΄κ±°λ‚˜ μ‚¬μš©ν•˜μ§€ μ•Šμ„ λͺ¨λ“  것을 미리 λ‘œλ“œν•˜λŠ” 것은 λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, νŽ˜μ΄μ§€ ν•˜λ‹¨μ— μžˆλŠ” μ΄λ―Έμ§€λ‚˜, νŠΉμ • λ²„νŠΌμ„ ν΄λ¦­ν•΄μ•Όλ§Œ λ³΄μ΄λŠ” λͺ¨λ‹¬ 창의 μ½”λ“œλŠ” μ‚¬μš©μžκ°€ ν•΄λ‹Ή μ˜μ—­μ— λ„λ‹¬ν•˜κ±°λ‚˜ λ²„νŠΌμ„ λˆ„λ₯΄κΈ° μ „κΉŒμ§€λŠ” ν•„μš” 없을 수 μžˆμŠ΅λ‹ˆλ‹€. μ§€μ—° λ‘œλ”©μ„ 톡해 μ΄λŸ°Β λΉ„ν•΅μ‹¬μ μΈ(non-critical) λ¦¬μ†ŒμŠ€μ˜ λ‘œλ”©μ„ λ’€λ‘œ 미루면 초기 λ‘œλ”© 속도λ₯Ό 크게 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ””λ°”μš΄μŠ€, μ“°λ‘œν‹€λ§μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

두 개 λͺ¨λ‘, ν•¨μˆ˜ μ‹€ν–‰ 횟수λ₯Ό μ‘°μ ˆν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

  • λ””λ°”μš΄μŠ€
    • 핡심: 짧은 μ‹œκ°„ λ‚΄ μ—°μ†λ˜λŠ” 이벀트λ₯Ό λ§ˆμ§€λ§‰μ— ν•˜λ‚˜λ‘œ μ²˜λ¦¬ν•˜λŠ” 것.
    • μ΄λ²€νŠΈκ°€ μ—°μ†ν•˜μ—¬ λ°œμƒν•˜λŠ” 경우, λ§ˆμ§€λ§‰ μ΄λ²€νŠΈκ°€ λ°œμƒ ν›„ 일정 μ‹œκ°„λ™μ•ˆ μΆ”κ°€ μ΄λ²€νŠΈκ°€ 없을 μ‹œ β€˜ν•œ λ²ˆλ§Œβ€™ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ—°λ‹¬μ•„μ„œ μ΄λ²€νŠΈκ°€ λ“€μ–΄μ˜€λŠ” 경우 타이머λ₯Ό λ¦¬μ…‹ν•©λ‹ˆλ‹€.
    • ex1) 검색창 μžλ™ μ™„μ„± μ‹œ, 'γ„Ή', '리', '리ㅇ', '리애', '리앑', 'λ¦¬μ•‘γ…Œβ€™ μ΄λ ‡κ²Œ μΉ  λ•Œλ§ˆλ‹€ API μš”μ²­μ΄ λ°œμƒν•˜λŠ” 상황 λ°©μ§€
    • ex2) μ°½ 크기 μ‘°μ ˆμ„ μœ„ν•΄ λ“œλž˜κ·Έλ₯Ό ν•˜λŠ” κ²½μš°μ—, μœ μ €κ°€ λ“œλž˜κ·Έλ₯Ό λ©ˆμΆ”κ³  μ΅œμ’… 크기둜 ν•œ 번만 계산할 μ‹œ
  • μ“°λ‘œν‹€λ§
    • 핡심: 일정 μ‹œκ°„ κ°„κ²©μœΌλ‘œ μ‹€ν–‰ 횟수λ₯Ό μ œν•œ.
    • μ΄λ²€νŠΈκ°€ μ—°μ†ν•˜μ—¬ λ°œμƒν•˜λŠ” 경우, μ •ν•΄μ§„ μ‹œκ°„ κ°„κ²©λ™μ•ˆ β€˜μ΅œλŒ€ ν•œ λ²ˆβ€™λ§Œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€. λ§Œμ•½ μ“°λ‘œν‹€λ§ μ£ΌκΈ°λ₯Ό 1초둜 μ„€μ •ν•  경우, 1μ΄ˆμ— μ΄λ²€νŠΈκ°€ 100번 λ°œμƒν•΄λ„, ν•Έλ“€λŸ¬λŠ” 단 ν•œ 번만 μ‹€ν–‰λ©λ‹ˆλ‹€.
    • ex1) 슀크둀 μœ„μΉ˜λ₯Ό κ³„μ‚°ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό μ£ΌλŠ” 경우, 자주 μ‹€ν–‰ λ μ‹œ 버벅이기 λ•Œλ¬Έμ— 100ms에 ν•œ 번으둜 μ œν•œ.
    • ex2) μ‚¬μš©μžκ°€ API ν˜ΈμΆœμ„ ν•˜λŠ” λ²„νŠΌμ„ μ—°νƒ€ν•˜λ”λΌλ„ μ„œλ²„ λΆ€ν•˜λ₯Ό μ•ˆμ£Όλ„λ‘ μš”μ²­ 간격을 μ œν•œ

기타

AJAX에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

AJAXλŠ” JavaScriptλ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ„λ™κΈ°μ μœΌλ‘œ 데이터λ₯Ό μš”μ²­ν•˜κ³  μ„œλ²„μ—μ„œ 받은 응닡을 μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 νŽ˜μ΄μ§€ 전체λ₯Ό μƒˆλ‘œκ³ μΉ¨ ν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ μ—…λ°μ΄νŠΈν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

fetch APIλ₯Ό 톡해 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ™œ ν•¨μˆ˜ 싀행을 Stack으둜 κ΄€λ¦¬ν•˜λ‚˜μš”?

κ°€μž₯ 큰 μ΄μœ λŠ” ν•¨μˆ˜μ˜Β ν˜ΈμΆœ 방식이 μŠ€νƒμ˜ λ™μž‘ 방식인 'ν›„μž…μ„ μΆœ(LIFO, Last-In First-Out)'κ³Ό μ•„μ£Ό 잘 맞기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μƒκ°ν•΄λ³΄μ‹œλ©΄, ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, μ›λž˜ ν•¨μˆ˜λŠ” μž μ‹œ λ©ˆμΆ”κ³  μƒˆλ‘œ 호좜된 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μž–μ•„μš”? 그리고 μƒˆλ‘œ 호좜된 ν•¨μˆ˜κ°€ λλ‚˜μ•Ό μ›λž˜ ν•¨μˆ˜λ‘œ λŒμ•„μ™€μ„œ 남은 μž‘μ—…μ„ 이어가죠. λ§Œμ•½ κ·Έ μƒˆλ‘œ 호좜된 ν•¨μˆ˜κ°€ 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€λ©΄, κ·Έ 호좜 과정이 계속 μ€‘μ²©λ©λ‹ˆλ‹€.

콜 μŠ€νƒμ€ λ°”λ‘œ 이런 μˆœμ„œλ₯Ό κ΄€λ¦¬ν•˜κΈ°μ— λ”± 쒋은 μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.