🧑 JavaScript

[JS] λ³€μˆ˜(Variable)

Genie_. 2025. 3. 18. 16:11
728x90
λ°˜μ‘ν˜•

πŸ“š λ³€μˆ˜(Variable)

πŸ“ λ³€μˆ˜(Variable)

λ³€μˆ˜(Variable)λž€

  1. ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체 λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름
  2. κ°’μ˜ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” 상직적인 이름

 

β‡οΈŽ λ³€μˆ˜ 이름(λ³€μˆ˜λͺ…) : λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 값을 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름
β‡οΈŽ λ³€μˆ˜ κ°’ : λ³€μˆ˜μ— μ €μž₯된 κ°’
β‡οΈŽ ν• λ‹Ή(λŒ€μž…,μ €μž₯/assignment) : λ³€μˆ˜μ— 값을 μ €μž₯ν•˜λŠ” 것
β‡οΈŽ μ°Έμ‘°(reference) : λ³€μˆ˜μ— μ €μž₯된 값을 읽어 λ“€μ΄λŠ” 것

// 예제 : 10 + 20의 μ—°μ‚°κ²°κ³Ό 30을 resultλΌλŠ” λ³€μˆ˜μ— μ €μž₯ν•œ 것
var result = 10 + 20;

 

πŸ’‘ λ³€μˆ˜μ— μ—¬λŸ¬ 개의 값을 μ €μž₯ν•˜λŠ” 방법

λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”μ»€λ‹ˆμ¦˜
μ—¬λŸ¬ 개의 값을 μ €μž₯ν•˜λ €λ©΄ μ—¬λŸ¬ 개의 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
단, λ°°μ—΄μ΄λ‚˜ 객체같은 자료ꡬ쑰 μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ 개의 값을 κ·Έλ£Ήν•˜ν•΄μ„œ ν•˜λ‚˜μ˜ κ°’μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯

// λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨
var userId = 1;
var userName = "Lee";

// κ°μ²΄λ‚˜ λ°°μ—΄ 같은 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ 개의 값을 ν•˜λ‚˜λ‘œ κ·Έλ£Ήν™”ν•΄μ„œ ν•˜λ‚˜μ˜ κ°’μ²˜λŸΌ μ‚¬μš©ν•  수 있음
var user = { id: 1, name: 'Lee' };

var users = [
    { id: 1, name: 'Lee'},
    { id: 2, name: 'Kim'}
];

πŸ“ μ‹λ³„μž(Identifier)

μ‹λ³„μž(Identifier) λŠ” μ–΄λ–€ 값을 κ΅¬λ³„ν•΄μ„œ 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름을 λ§ν•œλ‹€.

  • μ‹λ³„μž resultλŠ” κ°’ 30을 식별할 수 μžˆλ‹€.
  • 이λ₯Ό μœ„ν•΄ resultλŠ” κ°’ 30이 μ €μž₯λ˜μ–΄ μžˆλŠ”λ©”λͺ¨λ¦¬ μ£Όμ†Œ(0x0669F913)λ₯Ό κΈ°μ–΅ν•œλ‹€.
  • 즉, μ‹λ³„μžλŠ” 값이 μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œμ™€ λ§€ν•‘ 관계λ₯Ό 맺으며, λ§€ν•‘ 정보도 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄μ•Ό ν•œλ‹€.

 

μ‹λ³„μžλŠ” 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•˜κ³  μžˆλ‹€.
μ‹λ³„μžλ‘œ 값을 κ΅¬λ³„ν•΄μ„œ μ‹λ³„ν•œλ‹€λŠ” 것 = μ‹λ³„μžκ°€ κΈ°μ–΅ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 값에 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 의미
즉, μ‹λ³„μžλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— 뢙인 이름이라고 ν•  수 있음

 

  • λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름은 λͺ¨λ‘ μ‹λ³„μž
    • λ³€μˆ˜ 이름 -> λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜ κ°’ 식별
    • ν•¨μˆ˜ 이름 -> λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό 식별
  • 즉, λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” μ–΄λ–€ 값을 식별할 수 μžˆλŠ” 이름은 λͺ¨λ‘ μ‹λ³„μž

 

πŸ“ λ³€μˆ˜ μ„ μ–Έ(Variable Declaration)

λ³€μˆ˜ μ„ μ–Έ(Variable Declaration)은 λ³€μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 것

값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  λ³€μˆ˜ 이름과 ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό μ—°κ²°ν•΄μ„œ 값을 μ €μž₯ν•  수 있게 μ€€λΉ„ν•˜λŠ” 것

  • λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ 선언이 ν•„μš”
  • λ³€μˆ˜ μ„ μ–Έμ‹œ var, let, const ν‚€μ›Œλ“œ μ‚¬μš©
  • ES6μ—μ„œ let, const ν‚€μ›Œλ“œ λ„μž…λ˜μ—ˆμŒ, 이 μ „κΉŒμ§€λŠ” var ν‚€μ›Œλ“œλ§Œ μ‚¬μš©ν–ˆλ‹€.

 

πŸ’‘ var ν‚€μ›Œλ“œ 단점

블둝 레벨 μŠ€μ½”ν”„(Block-Level Scope)λ₯Ό μ§€μ›ν•˜μ§€ μ•Šκ³ , ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(Functional-Level Scope)λ₯Ό μ§€μ›ν–ˆλ‹€.
이둜 인해 μ˜λ„μΉ˜ μ•Šκ²Œ `μ „μ—­ λ³€μˆ˜κ°€ μ„ μ–Έ`λ˜μ–΄ μ‹¬κ°ν•œ λΆ€μž‘μš©μ΄ λ°œμƒν•  수 μžˆλ‹€.

이런 var ν‚€μ›Œλ“œμ˜ 단점을 λ³΄μ™„ν•˜κΈ°μœ„ν•΄ λ“±μž₯ν•œ 것듀이 ES6에 λ„μž…λœ `letκ³Ό const` λ‹€.
이 λ‘˜μ€ `블둝 레벨 μŠ€μ½”ν”„λ₯Ό 지원`ν•œλ‹€.

 

πŸ’‘ ν‚€μ›Œλ“œ(Keyword)   

μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μˆ˜ν–‰ν•  λ™μž‘μ„ κ·œμ •ν•œ μΌμ’…μ˜ λͺ…λ Ήμ–΄

 

  1. λ³€μˆ˜ 선언문은 λ³€μˆ˜ 이름을 λ“±λ‘ν•˜κ³  값을 μ €μž₯ν•  λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•œλ‹€.
  2. λ³€μˆ˜ μ„ μ–Έν•œ 이후, λ³€μˆ˜μ— 값은 아직 ν• λ‹Ήν•˜μ§€ μ•Šμ•˜λ‹€.
  3. λ”°λΌμ„œ, ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간은 λΉ„μ–΄μžˆμ„ κ²ƒμœΌλ‘œ 생각할 수 μžˆμœΌλ‚˜ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ—λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ undefined 값이 μ•”λ¬΅μ μœΌλ‘œ ν• λ‹Ήλ˜μ–΄ μ΄ˆκΈ°ν™”λœλ‹€.

 

πŸ’‘ undefined   

undefinedλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” μ›μ‹œ νƒ€μž…μ˜ κ°’(Primitive value)이닀.

 

λ³€μˆ˜ 선언을 2단계에 거쳐 μˆ˜ν–‰ν•œλ‹€.

  1. μ„ μ–Έ 단계 : λ³€μˆ˜ 이름을 λ“±λ‘ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦°λ‹€.
  2. μ΄ˆκΈ°ν™” 단계 : 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό ν• λ‹Ήν•΄ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • var let const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ 선언은 선언단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μ§„ν–‰ λœλ‹€.
  • 예λ₯Ό λ“€μ–΄ var score;λŠ” μ„ μ–Έ 단계λ₯Ό 톡해 λ³€μˆ˜ 이름 scoreλ₯Ό λ“±λ‘ν•œλ‹€.
  • μ΄ˆκΈ°ν™” 단계λ₯Ό 톡해 score λ³€μˆ˜μ— μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό ν• λ‹Ήν•΄ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • λ”°λΌμ„œ, var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ–΄λ– ν•œ 값도 ν• λ‹Ήν•˜μ§€ μ•Šμ•„λ„ 기본적으둜 undefined λΌλŠ” 값을 κ°–λŠ”λ‹€.

 

 πŸ’‘ μ“°λ ˆκΈ° κ°’(Garbage value)

μ΄ˆκΈ°ν™” 단계λ₯Ό κ±°μΉ˜μ§€ μ•ŠμœΌλ©΄ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ—λŠ” 이전에 λ‹€λ₯Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©ν–ˆλ˜ 값이 남아 μžˆμ„ 수 μžˆλ‹€.
μ΄λŸ¬ν•œ 값을 "μ“°λ ˆκΈ° κ°’(Garbage value)" 라고 ν•œλ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ var ν‚€μ›Œλ“œλŠ” μ•”λ¬΅μ μœΌλ‘œ undefined κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ μœ„ν—˜μœΌλ‘œλΆ€ν„° μ•ˆμ „ν•˜λ‹€.
  • μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— μ ‘κ·Όν•˜λ©΄ ReferenceError(μ°Έμ‘° μ—λŸ¬)κ°€ λ°œμƒν•œλ‹€.
  • μ‹λ³„μžλ₯Ό 톡해 값을 μ°Έμ‘°ν•˜λ € ν–ˆμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ“±λ‘λœ μ‹λ³„μžλ₯Ό 찾을 수 없을 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬

 

πŸ“ λ³€μˆ˜ μ„ μ–Έμ˜ μ‹€ν–‰ μ‹œμ κ³Ό λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…(variable hoisting)은 λ³€μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•

console.log(score); // undefined

var score; // λ³€μˆ˜ μ„ μ–Έλ¬Έ
  • μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” 인터프리터에 μ˜ν•΄ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰
  1. console.log(score);κ°€ κ°€μž₯λ¨Όμ € μ‹€ν–‰
  2. var score; μ‹€ν–‰
  • console.log(score);κ°€ μ‹€ν–‰λ˜λŠ” μ‹œμ μ—λŠ” 아직 score λ³€μˆ˜μ˜ 선언이 μ‹€ν–‰λ˜μ§€ μ•Šμ•˜μŒ
    • μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•  것 처럼 λ³΄μž„ -> ν•˜μ§€λ§Œ undefinedκ°€ 좜λ ₯

 

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό ν•œ 쀄씩 순차적으둜 μ‹€ν–‰ν•˜κΈ°μ— μ•žμ„œ λ¨Όμ € μ†ŒμŠ€μ½”λ“œμ˜ 평가 과정을 κ±°μΉ˜λ©΄μ„œ μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€.
  • 엔진은 λ³€μˆ˜ 선언을 ν¬ν•¨ν•œ λͺ¨λ“  μ„ μ–Έλ¬Έ(λ³€μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ“±)을 μ†ŒμŠ€μ½”λ“œμ—μ„œ μ°Ύμ•„λ‚΄ λ¨Όμ € μ‹€ν–‰
  • μ†ŒμŠ€μ½”λ“œμ˜ 평가 과정이 λλ‚˜λ©΄ λ³€μˆ˜ 선언을 ν¬ν•¨ν•œ λͺ¨λ“  선언문을 μ œμ™Έν•˜κ³  μ†ŒμŠ€μ½”λ“œλ₯Ό ν•œ 쀄씩 순차적 μ‹€ν–‰
  • 즉, λ³€μˆ˜ 선언이 μ†ŒμŠ€μ½”λ“œμ˜ 어디에 μžˆλ“  상관없이 λ‹€λ₯Έ μ½”λ“œλ³΄λ‹€ λ¨Όμ € μ‹€ν–‰ -> λ³€μˆ˜ 선언이 어디에 μœ„μΉ˜ν•˜λ˜ 상관없이 μ–΄λ””μ„œλ“  λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. ( ReferenceErrorκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 이유 )

 

πŸ“ κ°’μ˜ ν• λ‹Ή/μž¬ν• λ‹Ή

값을 ν• λ‹Ή(assignment)/λŒ€μž…,μ €μž₯ν•  λ•ŒλŠ” ν• λ‹Ή μ—°μ‚°μž =λ₯Ό μ‚¬μš©ν•œλ‹€.

var score; // λ³€μˆ˜ μ„ μ–Έ
score = 80; // κ°’μ˜ ν• λ‹Ή

var score = 80; // λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ή
πŸ’‘ "λ³€μˆ˜ μ„ μ–Έ(μ„ μ–Έ 단계 & μ΄ˆκΈ°ν™” 단계)"이 μ†ŒμŠ€μ½”λ“œκ°€ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ , 즉 λŸ°νƒ€μž„(Runtime)이 μ•„λ‹ˆλΌ κ·Έ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.
console.log(score); // undefined

score = 80; // κ°’μ˜ ν• λ‹Ή
var score; // λ³€μˆ˜ μ„ μ–Έ

console.log(score); // 80
  • λ³€μˆ˜ μ„ μ–Έ : λŸ°νƒ€μž„ 이전에 λ¨Όμ € μ‹€ν–‰
  • κ°’μ˜ ν• λ‹Ή : λŸ°νƒ€μž„μ— μ‹€ν–‰

 

κ°’μ˜ μž¬ν• λ‹Ήμ€ 이미 값이 ν• λ‹Ήλ˜μ–΄ μžˆλŠ” λ³€μˆ˜μ— μƒˆλ‘œμš΄ 값을 λ˜λ‹€μ‹œ ν• λ‹Ήν•˜λŠ” 것

var score = 80; // λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ή
score = 90; // κ°’μ˜ μž¬ν• λ‹Ή
  • μž¬ν• λ‹Ήμ€ λ³€μˆ˜μ— μ €μž₯된 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•œλ‹€.
  • 값을 μž¬ν• λ‹Ή ν•  수 μ—†μ–΄μ„œ λ³€μˆ˜μ— μ €μž₯된 값을 λ³€κ²½ν•  수 μ—†λ‹€λ©΄ λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ μƒμˆ˜(constant)라 ν•œλ‹€.
    • μƒμˆ˜λŠ” ν•œ 번 μ •ν•΄μ§€λ©΄ λ³€ν•˜μ§€ μ•ŠλŠ” κ°’, ν•œ 번만 ν• λ‹Ήν•  수 μžˆλŠ” λ³€μˆ˜

 

πŸ’‘ const ν‚€μ›Œλ“œ
const ν‚€μ›Œλ“œλŠ” 단 ν•œ 번만 ν• λ‹Ήν•  수 μžˆλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.
const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μƒμˆ˜λ₯Ό ν‘œν˜„ ν•  수 μžˆλ‹€.

 

πŸ“ μ‹λ³„μž 넀이밍 κ·œμΉ™

  • μ‹λ³„μžλŠ” 특수문자λ₯Ό μ œμ™Έν•œ 문자, 숫자, μ–Έλ”μŠ€μ½”μ–΄(_), λ‹¬λŸ¬ 기호($)λ₯Ό 포함할 수 μžˆλ‹€.
  • 단 μ‹λ³„μžλŠ” 특수문자λ₯Ό μ œμ™Έν•œ 문자, μ–Έλ”μŠ€μ½”μ–΄(_), λ‹¬λŸ¬ 기호($)둜 μ‹œμž‘ν•΄μ•Όν•œλ‹€.
    • 숫자둜 μ‹œμž‘ν•˜λŠ”κ²ƒμ€ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μ˜ˆμ•½μ–΄λŠ” μ‹λ³„μžλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.
    • 예 : if, class, const, do, delete, extends λ“±λ“±
// 카멜 μΌ€μ΄μŠ€(camelCase)
var firstName;

// μŠ€ν…Œμ΄ν¬ μΌ€μ΄μŠ€(snake_case)
var first_name;

// 파슀칼 μΌ€μ΄μŠ€(PascalCase)
var FirstName;

// 헝가리언 μΌ€μ΄μŠ€(typeHungarianCase)
var strFirstName; // type + identifier
var $elem = document.getElementById('myId'); // DOM λ…Έλ“œ
var observable$ = fromEvent(document, 'click'); // RxJS μ˜΅μ €λ²„λΈ”
  • λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ˜ μ΄λ¦„μ—λŠ” 카멜 μΌ€μ΄μŠ€ μ‚¬μš©
  • μƒμ„±μž ν•¨μˆ˜, 클래슀의 μ΄λ¦„μ—λŠ” 파슀칼 μΌ€μ΄μŠ€

https://github.com/gxnie/modernJS__deepDive/blob/main/ch04/Variable.md?plain=1

 

modernJS__deepDive/ch04/Variable.md at main · gxnie/modernJS__deepDive

Contribute to gxnie/modernJS__deepDive development by creating an account on GitHub.

github.com

 

728x90
λ°˜μ‘ν˜•