/
πŸ“™

JS Variable

JavaScript
Table of contents

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ³€μˆ˜(Variable)

λ³€μˆ˜(Variable)λŠ” ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체 λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 고유의 이름인 μ‹λ³„μž(identifier)λ₯Ό λͺ…μ‹œν•œ 것이닀.

ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜λŠ” 데이터λ₯Ό 일정 κΈ°κ°„ λ™μ•ˆ κΈ°μ–΅ν•˜μ—¬ ν•„μš”ν•œ λ•Œμ— λ‹€μ‹œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 값을 μ €μž₯ν•˜κ³  μ°Έμ‘°ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ κ°’μ˜ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” 상징적인 이름이닀.

λ³€μˆ˜λͺ…

λ³€μˆ˜μ— λͺ…μ‹œν•œ κ³ μœ ν•œ μ‹λ³„μž

λ³€μˆ˜κ°’

λ³€μˆ˜λ‘œ μ°Έμ‘°ν•  수 μžˆλŠ” 데이터

μ‹λ³„μž(identifier)

μ–΄λ–€ κ°’μ΄λ‚˜ λŒ€μƒμ„ μœ μΌν•˜κ²Œ 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름을 λ§ν•œλ‹€.

λ³€μˆ˜λͺ…, ν•¨μˆ˜λͺ…, ν”„λ‘œνΌν‹°λͺ…(ν”„λ‘œνΌν‹° ν‚€), 클래슀λͺ… 등이 μžˆλ‹€.

값은 λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ 있고, μ‹λ³„μžλŠ” λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•˜μ—¬ νŠΉμ • 값을 λΆ„λ³„ν•˜κ³  식별할 수 μžˆλ‹€.

ν•œλ§ˆλ””λ‘œ μ‹λ³„μžλŠ” 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅(μ €μž₯)ν•˜κ³  μžˆλ‹€.

λ³€μˆ˜ μ„ μ–Έ(Variable declaration)

λ³€μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 것을 λ§ν•œλ‹€. 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 확보(allocate, ν• λ‹Ή)ν•˜κ³  λ³€μˆ˜ 이름과 ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό μ—°κ²°(name binding)ν•΄μ„œ 값을 μ €μž₯ν•  수 있게 ν•œλ‹€.

λ³€μˆ˜ 선언에 μ˜ν•΄ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간은 확보가 ν•΄μ œ(release)되기 μ΄μ „κΉŒμ§€λŠ” λˆ„κ΅¬λ„ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•  수 없도둝 λ³΄ν˜Έλ˜λ―€λ‘œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

λ³€μˆ˜λŠ” var, let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έ ν•˜κ³  ν• λ‹Ή μ—°μ‚°μž(=)λ₯Ό μ‚¬μš©ν•΄ 값을 ν• λ‹Ή ν•œλ‹€.

그리고 μ‹λ³„μžμΈ λ³€μˆ˜λͺ…을 μ‚¬μš©ν•΄ λ³€μˆ˜μ— μ €μž₯된 값을 μ°Έμ‘° ν•œλ‹€.

javascript
// μ„ μ–Έ
var name;
// ν• λ‹Ή
name = 'JiSop';
// μ°Έμ‘°
console.log(name);

λ³€μˆ˜ 생성 단계

  1. μ„ μ–Έ 단계(Declaration phase)

    • λ³€μˆ˜ 객체(Variable Object)에 λ³€μˆ˜λ₯Ό λ“±λ‘ν•œλ‹€. 이 λ³€μˆ˜ κ°μ²΄λŠ” μŠ€μ½”ν”„κ°€ μ°Έμ‘°ν•˜λŠ” λŒ€μƒμ΄ λœλ‹€. (λ³€μˆ˜ 이름을 λ“±λ‘ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦°λ‹€)
  2. μ΄ˆκΈ°ν™” 단계(Initialization phase)

    • λ³€μˆ˜ 객체(Variable Object)에 λ“±λ‘λœ λ³€μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•œλ‹€. 이 λ‹¨κ³„μ—μ„œ λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”λœλ‹€. (값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό ν• λ‹Ή)
  3. ν• λ‹Ή 단계(Assignment phase)

    • undefined둜 μ΄ˆκΈ°ν™”λœ λ³€μˆ˜μ— μ‹€μ œκ°’μ„ ν• λ‹Ήν•œλ‹€.

var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ 선언은 μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μ§„ν–‰λ˜κ³ ,
let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ 선언은 μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λœλ‹€.

var ν‚€μ›Œλ“œ

ES6 이전에 λ³€μˆ˜ 선언을 ν•˜κΈ°μœ„ν•œ μœ μΌν•œ ν‚€μ›Œλ“œμ΄λ‹€. 사라진 것은 μ•„λ‹ˆλΌ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μ£Όμ˜ν•  점이 많고, μ—¬λŸ¬κ°€μ§€ 문제λ₯Ό 가지고 μžˆμ–΄ 더 이상 μ‚¬μš©μ„ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ˜ νŠΉμ§•

주의λ₯Ό κΈ°μšΈμ΄μ§€ μ•ŠμœΌλ©΄ μ‹¬κ°ν•œ 문제λ₯Ό μΌμœΌν‚¨λ‹€.

  • Function-level scopeλ₯Ό 가지고 μžˆλ‹€.

    • μ˜λ„μΉ˜ μ•Šκ²Œ μ „μ—­ λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ–΄ μ—¬λŸ¬κ°€μ§€ 문제λ₯Ό μΌμœΌν‚€κΈ° μ‰¬μ›Œμ§„λ‹€.
    • for loop μ΄ˆκΈ°ν™”μ‹μ—μ„œ μ‚¬μš©ν•œ λ³€μˆ˜λ₯Ό for loop μ™ΈλΆ€ λ˜λŠ” μ „μ—­μ—μ„œ μ°Έμ‘°ν•  수 μžˆλ‹€.
  • var ν‚€μ›Œλ“œ μƒλž΅ ν—ˆμš©

    • λ³€μˆ˜ μ„ μ–Έ ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ³€μˆ˜ 선언이 κ°€λŠ₯ν•˜κ³  ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ λ³€μˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜κΈ° λ•Œλ¬Έμ— μ „μ—­ λ³€μˆ˜κ°€ 될 수 μžˆλ‹€.
  • 쀑볡 μ„ μ–Έν—ˆμš©

    • var ν‚€μ›Œλ“œλŠ” 쀑볡 선언을 ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ— μ˜λ„ν•˜μ§€ μ•Šμ€ λ³€μˆ˜κ°’ 변경이 일어날 수 μžˆλ‹€.
  • μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— 이루어진닀.

    • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”κ°€ 이루어 μ§€λ©΄μ„œ undefined 값이 ν• λ‹Ήλœλ‹€.
  • λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° 전에 μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜λ‹€.

    • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜κ°€ μ„ μ–Έλ˜κΈ° 전인 λΌμΈμ—μ„œλ„ μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜λ‹€.

μ „μ—­ λ³€μˆ˜μ˜ 문제점

λŒ€λΆ€λΆ„μ˜ λ¬Έμ œλŠ” μ „μ—­ λ³€μˆ˜λ‘œ 인해 λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— λΆˆκ°€ν”Όν•œ 상황을 μ œμ™Έν•˜κ³  μ‚¬μš©μ„ μ–΅μ œν•΄μ•Ό ν•œλ‹€.

  • μ „μ—­ λ³€μˆ˜λŠ” 유효 scopeκ°€ λ„“μ–΄μ„œ μ–΄λ””μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ  것인지 νŒŒμ•…ν•˜κΈ° νž˜λ“€λ‹€.
  • λΉ„μˆœμˆ˜ ν•¨μˆ˜(Impure function)에 μ˜ν•΄ μ˜λ„ν•˜μ§€ μ•Šκ²Œ 변경될 μˆ˜λ„ μžˆμ–΄μ„œ λ³΅μž‘μ„±μ„ μ¦κ°€μ‹œν‚€λŠ” 원인이 λœλ‹€.

λ³€μˆ˜μ˜ 유효 scopeλŠ” μ’μ„μˆ˜λ‘ μ’‹λ‹€.

let, const ν‚€μ›Œλ“œ

var ν‚€μ›Œλ“œμ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ ES6 λΆ€ν„° letκ³Ό constκ°€ λ„μž… λ˜μ—ˆλ‹€.

let, const ν‚€μ›Œλ“œμ˜ 곡톡점

  • 쀑볡 μ„ μ–Έ κΈˆμ§€

    • 이름이 같은 λ³€μˆ˜λ₯Ό μ€‘λ³΅ν•΄μ„œ μ„ μ–Έν•˜λ©΄ SyntaxErrorκ°€ λ°œμƒν•œλ‹€.
  • block-level scope 지원

    • λͺ¨λ“  μ½”λ“œ 블둝을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€.
    • μ½”λ“œ λΈ”λ‘μœΌλ‘œλŠ” ν•¨μˆ˜, if λ¬Έ, for λ¬Έ, while λ¬Έ, try/catch λ¬Έ 등이 μžˆλ‹€.
  • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘ν•œλ‹€.

    • μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ)κ°€ μƒκΈ°λ©΄μ„œ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•˜λ©΄ ReferenceErrorκ°€ λ°œμƒν•œλ‹€.

      ⚠️ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘ν•˜λŠ” 것이지 ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것은 μ•„λ‹ˆλ‹€.

  • 전격 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.

μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(Temproal Dead Zone, TDZ)

μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” 단계 μ‹œμž‘ 지점(λ³€μˆ˜ μ„ μ–Έλ¬Έ)κΉŒμ§€μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간

'μ„ μ–Έ 단계'와 'μ΄ˆκΈ°ν™” 단계'κ°€ λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έ 단계가 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ μ΄ˆκΈ°ν™” λ‹¨κ³„λŠ” λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ μ‹€ν–‰λœλ‹€. μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λ˜κΈ° 이전에 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ μ°Έμ‘° μ—λŸ¬(ReferenceError)κ°€ λ°œμƒν•œλ‹€.

let, const ν‚€μ›Œλ“œμ˜ 차이점

let
  • μž¬ν• λ‹Ήμ΄ κ°€λŠ₯ν•˜λ‹€.
const
  • μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.

    • μž¬ν• λ‹Ή ν•˜λ €κ³  ν•˜λ©΄ TypeErrorκ°€ λ°œμƒν•œλ‹€.
  • μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”κ°€ 이루어져야 ν•œλ‹€.

    • μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”(값을 ν• λ‹Ή)λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ SyntaxErrorκ°€ λ°œμƒν•œλ‹€.
  • λ³€ν™”ν•˜μ§€ μ•ŠλŠ” μƒμˆ˜ μ„ μ–Έ

    • const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ λ‹€ μƒμˆ˜κ°€ λ˜λŠ” 것은 μ•„λ‹ˆκ³  값이 μ›μ‹œ 데이터 νƒ€μž…μΌ 경우만 ν•΄λ‹Ήν•œλ‹€.
    • μ›μ‹œ 데이터 νƒ€μž…μ€ immutable value이고 μž¬ν• λ‹Ήλ„ λΆˆκ°€λŠ₯ ν•˜κΈ° λ•Œλ¬Έμ— ν• λ‹Ή 된 값을 λ³€κ²½ν•  수 μ—†λ‹€.

    ⚠️ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ˜ 값이 객체일 경우 μ™ΈλΆ€μ˜ 영ν–₯으둜 값이 변경될 수 μžˆλ‹€.

    ν•œλ§ˆλ””λ‘œ λ³€μˆ˜μ˜ μž¬ν• λ‹Ήμ΄ κΈˆμ§€λ˜μ–΄ μžˆμ„ 뿐, 값이 변경될 μˆ˜λ„ μžˆλ‹€.

λ³€μˆ˜ λͺ…λͺ… κ·œμΉ™

  • μ˜λ¬Έμžμ™€ 숫자(0~9), 그리고 기호 $와 _만 μ‚¬μš©ν•  수 μžˆλ‹€.
  • 첫 κΈ€μžμ— 숫자λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
  • λŒ€/μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.
  • 일반적으둜 camelCaseλ₯Ό μ‚¬μš©ν•œλ‹€.
  • μ˜ˆμ•½μ–΄λŠ” μ‹λ³„μžλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.

μ˜ˆμ•½μ–΄(reserved word)

μ˜ˆμ•½μ–΄λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜κ³  μžˆκ±°λ‚˜ μ‚¬μš©λ  μ˜ˆμ •μΈ 단어λ₯Ό λ§ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ˜ˆμ•½μ–΄λ“€

await break case catch class const continue debugger default delete do else enum export extends false finally for function if implements import in Instanceof interface let new null package private protected public return super static switch this throw true try typeof var void while with yield*

* μ‹λ³„μžλ‘œ μ‚¬μš© κ°€λŠ₯ν•˜λ‚˜ Strict Modeμ—μ„œλŠ” μ‚¬μš© λΆˆκ°€

Dynamic Typing

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž…(dynamic/weak type) 언어이닀.

λ³€μˆ˜μ˜ νƒ€μž… 지정(Type annotation)없이 값이 ν• λ‹Ήλ˜λŠ” κ³Όμ •μ—μ„œ κ°’μ˜ νƒ€μž…μ— μ˜ν•΄ μžλ™μœΌλ‘œ νƒ€μž…μ΄ κ²°μ •(Type Inference)되기 λ•Œλ¬Έμ— 같은 λ³€μˆ˜μ— μ—¬λŸ¬ νƒ€μž…μ˜ 값을 ν• λ‹Ήν•  수 μžˆλ‹€.

Variable Hoisting

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  선언문은 ν˜Έμ΄μŠ€νŒ…(Hoisting)λœλ‹€. λ³€μˆ˜ μ„ μ–Έ λ˜ν•œ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€.

logo
Things I've Learned