λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Frontend Dev/JavaScript

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μžλ£Œν˜• - μ›μ‹œ νƒ€μž…(primitive type)κ³Ό 객체 νƒ€μž…(object type)의 νŠΉμ§•

λ°˜μ‘ν˜•

πŸ‘Ύ μ›μ‹œ νƒ€μž…(primitive type)

  1. λ³€μˆ˜μ— ν• λ‹Ήμ‹œ λ©”λͺ¨λ¦¬ 곡간에 κ°’ μžμ²΄κ°€ μ €μž₯λœλ‹€.
  2. μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›μ‹œ κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. (pass-by-value)
    → 원본을 변경해도 볡사본에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.
  3. μ›μ‹œ 값은 Immutable value(λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’). 즉, ν•œ 번 μƒμ„±λœ μ›μ‹œ μžλ£Œν˜•μ€ 읽기 μ „μš©(read only) 값이닀.
    → λ³€μˆ˜μ— λ‹€λ₯Έ 값을 μž¬ν• λ‹Ήμ‹œ μƒˆλ‘œμš΄ μ›μ‹œκ°’μ΄ μƒμ„±λ˜λ©°, λ³€μˆ˜κ°€ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간을 μ°Έμ‘°ν•œλ‹€. 그리고 기쑴에 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 값은 μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬μ—μ„œ μ‚­μ œλœλ‹€. (JavaScript의 가비지 μ½œλ ‰ν„°(garbage collector) μž‘λ™)

 

πŸ‘Ύ 객체 νƒ€μž…(object/reference type)

  1. λ³€μˆ˜μ— ν• λ‹Ήμ‹œ μ €μž₯ 곡간을 μ°Έμ‘°ν•  수 μžˆλŠ” μ£Όμ†Œκ°’(address)이 λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λœλ‹€.
    → μ΄λ•Œ μ°Έμ‘° μžλ£Œν˜•μ„ μ €μž₯ν•˜λŠ” 곡간을 νž™(heap)이라고 ν•œλ‹€.
  2. μ°Έμ‘° 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ£Όμ†Œκ°’μ΄ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. (Pass-by-reference)
    → 같은 μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κΈ° λ•Œλ¬Έμ— 원본을 λ³€κ²½ν•˜λ©΄ 볡사본도 영ν–₯을 λ°›λŠ”λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 두 λ³€μˆ˜λŠ” 같은 μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμ„ 뿐 κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ—ˆλ‹€κ³  ν•  수 μ—†λ‹€.
  3. μ°Έμ‘° 값은 Mutable value(λ³€κ²½ κ°€λŠ₯ν•œ κ°’)

 

πŸ‘Ύ MORE πŸ₯³

1. λ¬Έμžμ—΄μ€ immutableν•œ 값이기 λ•Œλ¬Έμ— μƒμ„±λœ λ¬Έμžμ—΄μ˜ 일뢀 문자λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€.

 • λ¬Έμžμ—΄μ€ ν•œ 번 μƒμ„±λ˜λ©΄, λ³€κ²½ν•  수 μ—†λ‹€.

let str = "Hello";
str = "JavaScript";

 → 첫번째 ꡬ문이 μ‹€ν–‰λ˜λ©΄ λ©”λͺ¨λ¦¬μ— λ¬Έμžμ—΄ "Hello"κ°€ μƒμ„±λ˜κ³  μ‹λ³„μž str은 λ©”λͺ¨λ¦¬μ— μƒμ„±λœ λ¬Έμžμ—΄ "Hello"의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가리킨닀. λ‘λ²ˆμ§Έ ꡬ문이 μ‹€ν–‰λ˜λ©΄ 이전에 μƒμ„±λœ λ¬Έμžμ—΄ "Hello"λ₯Ό μˆ˜μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ¬Έμžμ—΄ "JavaScript"λ₯Ό λ©”λͺ¨λ¦¬μ— μƒμ„±ν•˜κ³  μ‹λ³„μž str은 이것을 가리킨닀. μ΄λ•Œ λ¬Έμžμ—΄ "Hello"와 "JavaScript"λŠ” λͺ¨λ‘ λ©”λͺ¨λ¦¬μ— μ‘΄μž¬ν•˜κ³  μžˆλ‹€. λ³€μˆ˜ str은 λ¬Έμžμ—΄ "Hello"λ₯Ό 가리킀고 μžˆλ‹€κ°€ λ¬Έμžμ—΄ "JavaScript"λ₯Ό 가리킀도둝 λ³€κ²½λ˜μ—ˆμ„ 뿐이닀.

 

 • λ¬Έμžμ—΄μ€ λ°°μ—΄μ²˜λŸΌ 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆλŠ” μœ μ‚¬λ°°μ—΄μ΄λ‹€.

let str = "JavaScript";

for (let i = 0; i < str.length; i++) {
  console.log(str[i]);
}

str[6] = 's';
console.log(str); // JavaScript

 → str[6] = 's' 처럼 이미 μƒμ„±λœ 문자의 일뢀λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€. (read only 값이며, immutable ν•˜λ‹€.)

 

 • μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ μž¬ν• λ‹Ή ν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

let str = "JavaScript";
console.log(str) // JavaScript

str = "Hello, world";
console.log(str) // Hello, world

str = str.toUpperCase();
console.log(str) // HELLO, WORLD

 

 

2. Pass-by-reference와 Pass-by-value

• Pass-by-reference

 κ°μ²΄ νƒ€μž…μ€ 객체의 λͺ¨λ“  연산이 μ‹€μ œκ°’μ΄ μ•„λ‹Œ μ°Έμ‘°κ°’μœΌλ‘œ μ²˜λ¦¬λœλ‹€. 객체 νƒ€μž…μ€ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½, μΆ”κ°€, μ‚­μ œκ°€ κ°€λŠ₯ν•œ mutableν•œ 값이닀. λ™μ μœΌλ‘œ λ³€ν™”ν•  수 μžˆμœΌλ―€λ‘œ μ–΄λŠ μ •λ„μ˜ λ©”λͺ¨λ¦¬ 곡간을 확보해야 ν•˜λŠ”μ§€ μ˜ˆμΈ‘ν•  수 μ—†κΈ° λ•Œλ¬Έμ— λŸ°νƒ€μž„μ— λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  λ©”λͺ¨λ¦¬μ˜ νž™ μ˜μ—­(Heap Segment)에 μ €μž₯λœλ‹€.

 λ³€μˆ˜ a에 bλ₯Ό ν• λ‹Ήμ‹œ κ°μ²΄λŠ” λ³΅μ‚¬λ˜μ§€ μ•Šκ³ , μ°Έμ‘°(Reference) λ°©μ‹μœΌλ‘œ μ „λ‹¬λœλ‹€.

// Pass-by-reference
let obj = { num: 100 }
let copy = obj;

console.log(obj.num, copy.num) // 100 100
console.log(obj === copy) // true

copy.num = 200;
console.log(obj.num, copy.num) // 200 200
console.log(obj === copy) // true

 → λ³€μˆ˜ objλŠ” 객체 μžμ²΄κ°€ μ•„λ‹Œ μƒμ„±λœ 객체의 참쑰값을 μ €μž₯ν•˜κ³  있기 λ•Œλ¬Έμ— λ³€μˆ˜ copy에도 같은 참쑰값이 μ €μž₯λœλ‹€. λ”°λΌμ„œ μ°Έμ‘°ν•˜κ³  μžˆλŠ” 객체의 num 값이 λ³€κ²½λ˜λ©΄ λ³€μˆ˜ obj, copy λͺ¨λ‘ λ³€κ²½λœ 값을 μ°Έμ‘°ν•˜κ²Œ λœλ‹€.

 

let obj = { num: 100 };
let obj2 = { num: 100 };

console.log (obj === obj2) // false

 → obj와 obj2λŠ” λ‚΄μš©μ€ κ°™μ§€λ§Œ λ³„κ°œμ˜ 객체λ₯Ό μƒμ„±ν•˜μ—¬ 참쑰값을 ν• λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— 두 λ³€μˆ˜μ˜ 참쑰값은 같지 μ•Šλ‹€.

 

Pass-by-value

 μ›μ‹œ νƒ€μž…μ€ κ°’(value)으둜 μ „λ‹¬λœλ‹€. 즉, λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜λ©° 이λ₯Ό pass-by-value(값에 μ˜ν•œ 전달)라 ν•œλ‹€.

// Pass-by-value
let a = 1;
let b = a;

console.log(a, b); // 1 1
console.log(a === b); // true

a = 10;

console.log(a, b); // 10 1 
console.log(a === b); // false

 → λ³€μˆ˜ aλŠ” μ›μ‹œ νƒ€μž…μΈ 숫자 νƒ€μž… 1을 μ €μž₯ν•˜κ³  있으며, μ›μ‹œ νƒ€μž…μ€ 값이 λ³΅μ‚¬λ˜μ–΄ λ³€μˆ˜μ— μ €μž₯λœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ³€μˆ˜ b에 λ³€μˆ˜ aλ₯Ό ν• λ‹Ήν•œ 경우, λ³€μˆ˜ a의 κ°’ 1이 λ³΅μ‚¬λ˜μ–΄ λ³€μˆ˜ b에 μ €μž₯λœλ‹€.

 


자료좜처: poiemaweb

✏️ κ³΅λΆ€ν•˜λ©° μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 잘λͺ»λœ μ •λ³΄λ‚˜ 더 κ³΅μœ ν•  λ‚΄μš©μ΄ 있으면 λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ„Έμš”!

μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ 😊

λ°˜μ‘ν˜•