🌸04μž₯. λ³€μˆ˜

βœ…4.1 λ³€μˆ˜λž€ 무엇인가? μ™œ ν•„μš”ν•œκ°€?

λ©”λͺ¨λ¦¬(Memory)

λ©”λͺ¨λ¦¬λŠ” 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ μ…€(memory cell)의 집합체
- μ…€ ν•˜λ‚˜μ˜ ν¬κΈ°λŠ” 1byte(=8bit)
- 각 셀은 고유의 λ©”λͺ¨λ¦¬ μ£Όμ†Œ(memory address)λ₯Ό 가진닀.
  • μ»΄ν“¨ν„°λŠ” λ©”λͺ¨λ¦¬ μ…€μ˜ 크기(1byte) λ‹¨μœ„λ‘œ 데이터λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ½λŠ”λ‹€.

  • λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 0λΆ€ν„° μ‹œμž‘ν•΄μ„œ λ©”λͺ¨λ¦¬μ˜ 크기만큼 μ •μˆ˜λ‘œ ν‘œν˜„λ¨ (ex) 4GB λ©”λͺ¨λ¦¬ : 0 ~ 42494967295 (0x00000000 ~ 0xFFFFFFFF))

  • λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” λͺ¨λ“  값은 2μ§„μˆ˜μ΄λ‹€.

λ³€μˆ˜(Variable)

πŸ‘‰ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체. λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름(= κ°’μ˜ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” 상징적인 이름)
  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ 컴파일러 λ˜λŠ” 이터프리터에 μ˜ν•΄ 값이 μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ‘œ μΉ˜ν™˜λ˜μ–΄ 싀행됨

μ•„λž˜ μ˜ˆμ‹œλ₯Ό 톡해 확인해보면,

var result = 10 + 20;

// 10+20은 연산을 톡해 μƒˆλ‘œμš΄ κ°’ 30을 μƒμ„±ν•œλ‹€.
// μƒμ„±λœ 30은 λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λœλ‹€.
// μ΄λ•Œ μ €μž₯된 30을 λ‹€μ‹œ 읽어 λ“€μ—¬ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ 값이 μ €μž₯된 λ©”λͺ¨λ¦¬ 곡간에 상징적인 이름(result)을 λΆ™μž„
  • result = λ³€μˆ˜ 이름(λ³€μˆ˜λͺ…) : λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 값을 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름

  • λ³€μˆ˜μ— μ €μž₯된 κ°’(μƒμ„±λœ 30) = λ³€μˆ˜κ°’

  • λ³€μˆ˜μ— 값을 μ €μž₯ν•˜λŠ” ν–‰μœ„ = ν• λ‹Ή(assignment, λŒ€μž…, μ €μž₯)

  • λ³€μˆ˜μ— μ €μž₯된 값을 읽어 λ“€μ΄λŠ” 것 = μ°Έμ‘°(reference)

βœ…4.2 μ‹λ³„μž

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

πŸ‘‰μ–΄λ–€ 값을 κ΅¬λ³„ν•΄μ„œ 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름
  • resultλΌλŠ” μ‹λ³„μžλŠ” κ°’ 30을 식별할 수 μžˆμ–΄μ•Ό ν•œλ‹€.

  • 이λ₯Ό μœ„ν•΄ resultλŠ” κ°’ 30이 μ €μž₯λ˜μ–΄μžˆλŠ” λ©”λͺ¨λ¦¬μ£Όμ†Œ(0x0669F913)을 κΈ°μ–΅ν•΄μ•Ό ν•œλ‹€.

  • 즉, μ‹λ³„μžλŠ” 값이 μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œμ™€ 맀핑관계λ₯Ό 맺으며, 맀핑 정보도 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄μ•Ό ν•œλ‹€.

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

  • λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” μ–΄λ–€ 값을 식별할 수 이름은 λͺ¨λ‘ μ‹λ³„μžλ‹€.

    • λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜ κ°’, ν•¨μˆ˜, 클래슀 등을 식별할 수 μžˆλ‹€.

  • μ‹λ³„μžλŠ” λ„€μ΄λ°κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Όν•˜κ³ , μ„ μ–Έ(declaration)을 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ‹λ³„μžμ˜ 쑴재λ₯Ό μ•Œλ¦°λ‹€.

βœ…4.3 λ³€μˆ˜ μ„ μ–Έ

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

πŸ‘‰κ°’μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 확보(allocate)ν•˜κ³  λ³€μˆ˜ 이름과 ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό μ—°κ²°(name binding)ν•΄μ„œ 값을 μ €μž₯ν•  수 있게 μ€€λΉ„ν•˜λŠ” κ³Όμ •
  • λ³€μˆ˜ 선언에 μ˜ν•΄ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간은 ν•΄μ œ(release)되기 μ „κΉŒμ§€ λ³΄ν˜Έλœλ‹€.

  • λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ 선언이 ν•„μš”ν•˜κ³ , var, let, const ν‚€μ›Œλ“œλ₯Ό 톡해 μ„ μ–Έν•œλ‹€.

  • var β†’ ES6 λ„μž… ν›„(var, let, const)

    • var 의 단점 : 블둝 레벨 μŠ€μ½”ν”„ 미지원, ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ 지원. (β†’ μ˜λ„μΉ˜ μ•Šκ²Œ μ „μ—­λ³€μˆ˜ μ„ μ–Έ)

@ν‚€μ›Œλ“œ : μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μˆ˜ν–‰ν•  λ™μž‘μ„ κ·œμ •ν•œ μΌμ’…μ˜ λͺ…λ Ήμ–΄. 즉, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν‚€μ›Œλ“œλ₯Ό λ§Œλ‚˜λ©΄ μ•½μ†λœ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.

var ν‚€μ›Œλ“œ

console.log(score); // undefined
var score; // λ³€μˆ˜ μ„ μ–Έλ¬Έ
  • λ³€μˆ˜ 선언문은 λ³€μˆ˜ 이름을 λ“±λ‘ν•˜κ³  값을 μ €μž₯ν•  λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•œλ‹€

    • λ³€μˆ˜μ— 값은 아직 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœ.

    • ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간은 λΉ„μ–΄μžˆλŠ” 것이 μ•„λ‹˜. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ undefined값이 μ•”λ¬΅μ μœΌλ‘œ ν• λ‹Ήλ˜μ–΄ μ΄ˆκΈ°ν™”λœλ‹€.

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

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜ 선언을 2단계에 거쳐 μˆ˜ν–‰ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ λ³€μˆ˜ μ„ μ–Έ 단계
**1. "μ„ μ–Έ 단계"** : λ³€μˆ˜ 이름을 λ“±λ‘ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦°λ‹€.
**2. "μ΄ˆκΈ°ν™” 단계"** : 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό ν• λ‹Ήν•΄ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • λ³€μˆ˜μ΄λ¦„μ€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘λœλ‹€.

  • varλ₯Ό μ΄μš©ν•œ λ³€μˆ˜ 선언은 선언단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μ§„ν–‰λœλ‹€.

  • μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— μ ‘κ·Όν•˜λ©΄, ReferenceError(μ°Έμ‘°μ—λŸ¬)κ°€ λ°œμƒν•œλ‹€.

    • μ‹λ³„μžλ₯Ό 톡해 값을 μ°Έμ‘°ν•˜λ € ν–ˆμ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ“±λ‘λœ μ‹λ³„μžλ₯Ό 찾을 수 없을 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μ΄λ‹€.

@μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(execution context) :

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ†ŒμŠ€μ½”λ“œλ₯Ό ν‰κ°€ν•˜κ³  μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ ν™˜κ²½μ„ μ œκ³΅ν•˜κ³  μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ‹€μ œλ‘œ κ΄€λ¦¬ν•˜λŠ” μ˜μ—­

  • 즉, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹λ³„μžμ™€ μŠ€μ½”ν”„λ₯Ό κ΄€λ¦¬ν•œλ‹€.

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 내에 key-value ν˜•μ‹μΈ 객체둜 λ³€μˆ˜ 이름과 λ³€μˆ˜ 값이 λ“±λ‘λœλ‹€.

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

λ³€μˆ˜ μ„ μ–Έμ˜ μ‹€ν–‰μ‹œμ 

πŸ’‘"λ³€μˆ˜ μ„ μ–Έ(μ„ μ–Έ 단계 & μ΄ˆκΈ°ν™” 단계)"은 λŸ°νƒ€μž„(runtime)이 μ•„λ‹ˆλΌ κ·Έ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λœλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ¨Όμ € μ†ŒμŠ€μ½”λ“œμ˜ 평가 과정을 κ±°μΉ˜λ©΄μ„œ μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•  μ€€λΉ„λ₯Ό ν•œλ‹€.

  • 이 λ•Œ, λͺ¨λ“  μ„ μ–Έλ¬Έ(λ³€μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ“±)을 μ†ŒμŠ€μ½”λ“œμ—μ„œ μ°Ύμ•„λ‚΄ λ¨Όμ € μ‹€ν–‰ν•œλ‹€.

  • κ·Έ λ‹€μŒ, 선언문을 μ œμ™Έν•˜κ³  μ†ŒμŠ€ μ½”λ“œλ₯Ό ν•œ 쀄씩 순차적으둜 μ‹€ν–‰ν•œλ‹€.

μ•„λž˜ 예제λ₯Ό λ‹€μ‹œ μ‚΄νŽ΄λ³΄μž

console.log(score); // undefined
var score;
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 인터프리터에 μ˜ν•΄ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λ―€λ‘œ μœ„μ— μ½”λ“œλŠ” ReferenceErrorκ°€ λ°œμƒν•  κ²ƒμ²˜λŸΌ λ³΄μ΄λ‚˜ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  undefindκ°€ 좜λ ₯λœλ‹€.

  • λ³€μˆ˜ 선언이 μ†ŒμŠ€ μ½”λ“œκ°€ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ (λŸ°νƒ€μž„)이 μ•„λ‹ˆλΌ κ·Έ μ΄μ „λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…(Variable Hoisting)

πŸ‘‰λ³€μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜ 선언이 어디에 μžˆλ“  상관없이 λ‹€λ₯Έ μ½”λ“œλ³΄λ‹€ λ¨Όμ € μ‹€ν–‰λœλ‹€.

  • λ³€μˆ˜ μ„ μ–Έ(μ„ μ–Έ&μ΄ˆκΈ°ν™”)이 μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰ν•˜λŠ” 것을 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌ ν•œλ‹€.

βœ…4.5 κ°’μ˜ ν• λ‹Ή

β—λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ή(Assignment, λŒ€μž…, μ €μž₯) 은 μ‹€ν–‰μ‹œμ μ΄ λ‹€λ₯΄λ‹€.

λ³€μˆ˜ μ„ μ–Έ : λŸ°νƒ€μž„ 이전에 λ¨Όμ € μ‹€ν–‰
κ°’μ˜ ν• λ‹Ή : λŸ°νƒ€μž„(μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ )에 싀행됨

μ•„λž˜ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž (이미지: λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ή μ „ν›„ μ‹œμ  λ©”λͺ¨λ¦¬ ꡬ쑰)

console.log(score); // undefined

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

console.log(score); // 80

βœ…4.6 κ°’μ˜ μž¬ν• λ‹Ή

μž¬ν• λ‹Ή

πŸ‘‰μ΄λ―ΈΒ κ°’μ΄ ν• λ‹Ήλ˜μ–΄ μžˆλŠ” λ³€μˆ˜μ— μƒˆλ‘œμš΄ 값을 λ˜λ‹€μ‹œ ν• λ‹Ήν•˜λŠ” 것
  • λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— undefined둜 μ΄ˆκΈ°ν™” λ˜κΈ°λ•Œλ¬Έμ— μ—„λ°€νžˆ λ³€μˆ˜ 선언도 μž¬ν• λ‹Ήμ΄λΌκ³  ν•  수 μžˆλ‹€.

  • λ³€μˆ˜μ— 값을 μž¬ν• λ‹Ή ν•˜λ©΄, 이전 값이 μ €μž₯λ˜μ–΄ 있던 λ©”λͺ¨λ¦¬ 곡간을 μ§€μš°κ³  μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  값을 μ €μž₯ν•œλ‹€.

    • 이전 값은 μ–΄λ– ν•œ μ‹λ³„μžμ™€λ„ μ—°κ²°λ˜μ–΄μžˆμ§€ μ•Šκ²Œ 됨 β†’ 가비지 μ½œλ ‰ν„°μ— μ˜ν•΄ λ©”λͺ¨λ¦¬μ—μ„œ μžλ™ν•΄μ œλœλ‹€. (단, μ–Έμ œ ν•΄μ œλ μ§€λŠ” 예츑 X)

  • 값을 μž¬ν• λ‹Ήν•  수 μ—†μ–΄μ„œ λ³€μˆ˜μ— μ €μž₯된 값을 λ³€κ²½ν•  수 μ—†λŠ” 것은 μƒμˆ˜(constant)라 ν•œλ‹€.

@가비지 μ½œλ ‰ν„° : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν• λ‹Ή(allocate)ν•œ λ©”λͺ¨λ¦¬ 곡간을 주기적으둜 κ²€μ‚¬ν•˜μ—¬ 더이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œ(release)ν•˜λŠ” κΈ°λŠ₯ @더이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ : μ–΄λ–€ μ‹λ³„μžλ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 곡간

βœ…4.7 μ‹λ³„μž 넀이밍 κ·œμΉ™

  • μ‹λ³„μžλŠ” 특수문자λ₯Ό μ œμ™Έν•œ 문자, 숫자, μ–Έλ”μŠ€μ½”μ–΄(_), λ‹¬λŸ¬ 기호($) λ₯Ό 포함 ν•  수 μžˆλ‹€.

  • 단, μ‹λ³„μžλŠ” 특수문자λ₯Ό μ œμ™Έν•œ 문자, μ–Έλ”μŠ€μ½”μ–΄(_), λ‹¬λŸ¬ 기호($) 둜 μ‹œμž‘ν•΄μ•Ό ν•œλ‹€. (숫자 μ‹œμž‘ X)

  • μ˜ˆμ•½μ–΄λŠ” μ‹λ³„μžλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.

넀이밍 μ»¨λ²€μ…˜(Naming Convention)

  • ν•˜λ‚˜ μ΄μƒμ˜ μ˜λ‹¨μ–΄λ‘œ κ΅¬μ„±λœ μ‹λ³„μžλ₯Ό λ§Œλ“€ λ•Œ 가독성 μ’‹κ²Œ 단어λ₯Ό ν•œλˆˆμ— κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ κ·œμ •ν•œ λͺ…λͺ… κ·œμΉ™

// 카멜 μΌ€μ΄μŠ€(camelCase)
var fistMan;

// μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€(snake_case)
var first_man;

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

// 헝가리언 μΌ€μ΄μŠ€(typeHungarianCase)
var strFirstMan;
var $elem = document.getElementById("myId");
var observable$ = fromEvent(document, "click");
  • javascriptλŠ” 일반적으둜

    • λ³€μˆ˜, ν•¨μˆ˜ 이름 : 카멜 μΌ€μ΄μŠ€

    • μƒμ„±μž ν•¨μˆ˜, 클래슀 이름 : 파슀칼 μΌ€μ΄μŠ€

Last updated