1. μμ μλ£νκ³Ό μ°Έμ‘° μλ£νμ΄λ?
number, string, boolean, undefined, nullκ³Ό κ°μ μλ£νμ κ³ μ λ μ μ₯ 곡κ°μ μ°¨μ§νλ€. μ΄λ° νΉμ§μ κ°μ§ μλ£νμ μμ μλ£ν(primitive data type)μ΄λΌλ μ΄λ¦μΌλ‘ λΆλ₯νλ€. λ°λ©΄μ λλμ λ°μ΄ν°λ₯Ό λ€λ£¨κΈ°μ μ ν©ν λ°°μ΄κ³Ό κ°μ²΄, ν¨μ λ±μ μλ£νμ μ°Έμ‘° μλ£ν(reference data type)μ΄λΌκ³ λΆλ₯νλ€.
μμ νμ λ°μ΄ν°λ κ° λ³μκ°μ μμνμ λ°μ΄ν°λ₯Ό 볡μ¬ν κ²½μ°, λ°μ΄ν° κ°μ΄ 볡μ¬λκΈ° λλ¬Έμ κΈ°μ‘΄μ λ°μ΄ν°μ μν₯μ΄ κ°μ§ μμ. μ°Έμ‘° νμ λ°μ΄ν°λ μ£Όμλ₯Ό 볡μ¬νλ€. λλ¬Έμ 볡μ¬ν λ°μ΄ν°μμ μμλ₯Ό λ³κ²½νκ² λλ€λ©΄ μ£Όμ μμ μλ λ°μ΄ν°κ° λ³κ²½μ΄ λλ κ²μ΄κΈ°μ κΈ°μ‘΄μ λ°μ΄ν°μλ μν₯μ΄ κ°λ κ²μ΄λ€. μ½κ² μ€λͺ νμλ©΄, μμ μλ£νμ΄ ν λΉλ λλ λ³μμ κ°(value) μμ²΄κ° λ΄κΈ°κ³ , μ°Έμ‘° μλ£νμ΄ ν λΉλ λλ 보κ΄ν¨μ μ£Όμ(reference)κ° λ΄κΈ΄λ€κ³ ν μ μλ€. λν μ°Έμ‘° μλ£νμ κΈ°μ‘΄μ κ³ μ λ ν¬κΈ°μ 보κ΄ν¨μ΄ μλλΌ, λμ μΌλ‘ ν¬κΈ°κ° λ³νλ νΉλ³ν 보κ΄ν¨μ΄λ€.
2. μμ μλ£νκ³Ό μ°Έμ‘° μλ£νμ κ° νΉμ§
μμ μλ£ν
- μμ μλ£νμ λ³μμ ν λΉνλ©΄ λ©λͺ¨λ¦¬ 곡κ°μ 'κ° μ체'κ° μ μ₯λλ€.
- μμ κ°μ κ°λ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνλ©΄ μμ κ° μμ²΄κ° λ³΅μ¬λμ΄ μ λ¬λλ€.
- μμ μλ£νμ 'λ³κ²½ λΆκ°λ₯ν κ°(immutable value)' μ¦, ν λ² μμ±λ μμ μλ£νμ μ½κΈ°μ μ©(read only) κ°μ΄λ€.
μ°Έμ‘° μλ£ν
- μ°Έμ‘° μλ£νμ λ³μμ ν λΉνλ©΄ λ©λͺ¨λ¦¬ 곡κ°μ 'μ£Όμκ°'μ΄ μ μ₯λλ€.
- μ°Έμ‘° κ°μ κ°λ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνλ©΄ μ£Όμκ°μ΄ 볡μ¬λμ΄ μ λ¬λλ€.
- μ°Έμ‘° μλ£νμ λ³κ²½μ΄ κ°λ₯ν κ°(mutable value)μ΄λ€.
3. JavaScriptκ° μ°Έμ‘° μλ£νμ μ μ₯νλ λ°©λ²
ν(heap) μ΄λΌλ μ μ₯곡κ°μ μ°Έμ‘° μλ£νμ μ μ₯ν ν, κ·Έ μ μ₯곡κ°μ μ°Έμ‘°ν μ μλ μ£Όμκ°μ λ³μμ μ μ₯νλ€. λ°λΌμ λ³μμ ν΄λΉνλ μ μ₯곡κ°μλ μ£Όμκ°μ΄ μ μ₯λμ΄ μκ³ , κ·Έ μ£Όμκ°μ ν΅ν΄ μ°Έμ‘° μλ£νμκ² μ κ·Όνλ κ²μ΄λ€. μ΄ μ κ·Όμ 'μ°Έμ‘°νλ€(refer)'κ³ νλ€.
4. μμ κ° μ체λ₯Ό λ³΅μ¬ vs. μ£Όμκ°μ 볡μ¬
λ§μ½ μ΄λ€ λ³μμ μ μ₯λμ΄ μλ μμ μλ£νμ λ€λ₯Έ λ³μμ ν λΉνλ€λ©΄, μμ μλ£νμ κ° μμ²΄κ° λ³΅μ¬λλ€. λ°λΌμ λ³μ numκ³Ό λ³μ copiedNumμ λμΌνκ² 20μ΄λΌλ κ°μ κ°μ§λ€.
let num = 20;
let copiedNum = num;
μ°Έμ‘° μλ£νμ μ΄μ λ¬λ¦¬ μ£Όμκ°μ 볡μ¬νλ€. μ¦, μ°Έμ‘°μλ£νμ΄ ν λΉλ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνλ©΄, μ΄ λ λ³μλ κ°μ μ£Όμλ₯Ό κ°λ¦¬ν¨λ€.
let arr = [0, 1, 2, 3];
let copiedArr = arr;
μ 리νμλ©΄, κ° μ체λ₯Ό 볡μ¬νλ μμ μλ£νκ³Ό λ¬λ¦¬, μ°Έμ‘° μλ£νμ ν λΉν λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉν κ²½μ° 'κ°μ μ£Όμ'λ₯Ό μ°Έμ‘°νκ³ μλ κ²μ΄λ€.
// μμ μλ£νμ΄ μ°Έμ‘°λ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνκΈ°
let num = 20;
let copiedNum = num;
// μ°Έμ‘° μλ£νμ΄ ν λΉλ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνκΈ°
let arr = [0, 1, 2, 3];
let copiedArr = arr;
// λ λ³μκ° κ°μμ§ νμΈνκΈ° - 1
console.log(num === copiedNum); // true
console.log(arr === copiedArr); // true
// μλ³Έμ λ³κ²½νκΈ°
num = 30;
arr.push(4);
// λ λ³μκ° κ°μμ§ νμΈνκΈ° - 2
console.log(num === copiedNum); // false: μμμλ£νμ μλ³Έ(num)μ λ€λ₯Έ κ°μ ν λΉν΄λ 볡μ¬λ³Έ(copiedNum)μ μν₯μ λ―ΈμΉμ§ μμ
console.log(arr === copiedArr); // true: μ°Έμ‘°μλ£νμ μλ³Έ(arr)μ λ³κ²½νλ©΄ 볡μ¬λ³Έ(copiedArr)λ μν₯μ λ°κΈ°μ λμΌν΄μ§
// μ΄ λ λ³μμ νμ¬ μνλ?
console.log(copiedNum); // 20
console.log(copiedArr); // [0, 1, 2, 3, 4];
5. λ³κ²½ λΆκ°λ₯ν κ° vs. λ³κ²½μ΄ κ°λ₯ν κ°
μμ μλ£ν
ν λ² μμ±λ μμ κ°μ λ³κ²½ν μ μλ€. numμ΄λΌλ λ³μλ₯Ό μ μΈνκ³ μ«μ 20μ ν λΉν΄ λ³΄κ² λ€.
let num = 20;
μ¬κΈ°μ λ³μ numμ ν λΉλ κ°μ μ«μ 20λμ λ€λ₯Έ κ°μΌλ‘ λ³κ²½νκ³ μ νλ€λ©΄, λ€λ₯Έ κ°μ λ³μμ μ¬ν λΉ νλ©΄ λλ€.
num = 30;
λ³μμ ν λΉλ κ°μ΄ 20μμ 30μΌλ‘ λ³κ²½λμκΈ°μ μμ μλ£νμΈ μ«μ νμ μ κ°μ΄ λ³κ²½λ κ²μ²λΌ 보μΈλ€. κ·Έλ λ€λ©΄ μμ μλ£νμ΄ λ³κ²½ λΆκ°λ₯ν κ°μ΄λΌλ κ²μ λ¬΄μ¨ λ»μΈ κ±ΈκΉ? κ°μ μ¬ν λΉνμ λ λ©λͺ¨λ¦¬μμλ numμ΄λΌλ λ³μκ° μ°Έμ‘°νλ 곡κ°μ λ€μ΄ μλ 20μ΄ κ·Έλλ‘ 30μΌλ‘ λ³κ²½λ κ² κ°μ§λ§, λ©λͺ¨λ¦¬ λ΄λΆμμλ 30μ΄λΌλ μμ κ°μ μ μ₯νκΈ° μν 'μλ‘μ΄ κ³΅κ°μ ν보'ν λ€, κ·Έ 곡κ°μ numμ΄λΌλ μ΄λ¦μ λΆμ΄κ³ 30μ μ μ₯νλ κ²μ΄λ€. μ¦, 20λ² μ¬λ¬Όν¨μ΄ 30λ²μΌλ‘ λ³κ²½λ κ²μ΄ μλλΌ 20λ² μ¬λ¬Όν¨κ³Ό 30λ² μ¬λ¬Όν¨μ΄ λ³κ°λ‘ μ‘΄μ¬νλ κ²μ΄λ€. (μ«μ νμ λΏλ§ μλλΌ, λ¬Έμμ΄λ λ§μ°¬κ°μ§λ€.)
λ°λΌμ μμ μλ£νμ μ΄λ€ μν©μμλ λΆλ³νλ μ½κΈ° μ μ© λ°μ΄ν°μΈ κ²μ΄λ€. μ΄λ μμ μλ£νμ΄ λμ μ λ’°μ±μ κ°μ§ μ μλ μμΈμ΄κΈ°λ νλ€. κ·Έλ λ€λ©΄ λ¨μ μλ κ° 20μ μ΄λ»κ² λ κΉ? JavaScript μμ§μ μ΄μ²λΌ μ¬μ©νμ§ μλ κ°μ μλμΌλ‘ λ©λͺ¨λ¦¬μμ μμ νλ©°, μ΄λ¬ν κΈ°λ₯μ κ°λΉμ§ μ½λ ν°(garbage collector)λΌκ³ νλ€. λ¨, garbage collectorκ° μ΄λ μμ μ μ§νλλμ§λ μμΈ‘ν μ μλ€.
μ°Έμ‘° μλ£ν
λ°λ©΄ μ°Έμ‘° μλ£νμ λ³κ²½ κ°λ₯ν κ°μ΄λ€. μμ μλ£νμ κ²½μ° κ°μ ν¬κΈ°κ° κ±°μ μΌμ νκΈ° λλ¬Έμ μλ‘μ΄ κ³΅κ°μ ν보νμ¬ κ°μ 볡μ¬νλ λ°©λ²μ΄ μ μ©νμ§λ§, ν¬κΈ°κ° μΌμ νμ§ μμ μ°Έμ‘° μλ£νμ κ²½μ° λ§€λ² κ°μ 볡μ¬νλ€λ©΄ κ·Έλ§νΌ ν¨μ¨μ±μ λ¨μ΄μ§ μλ°μ μλ€. μ΄λ° μ΄μ λ‘ μ°Έμ‘° μλ£νμ λ³κ²½μ΄ κ°λ₯νλλ‘ μ€κ³λμ΄ μλ€.
arr[3] = '3';
arr.push(4);
arr.shift();
console.log(arr); // [1, 2, '3', 4] : μ μ½λκ° μ€νλλ©΄, λ³μκ° μ°Έμ‘°νκ³ μλ μ£Όμμ μ μ₯λμ΄ μλ κ°μ λ³κ²½ν¨
μ°Έκ³ λ‘, λ¬Έμμ΄μ μμ μλ£νμ΄μ§λ§ λ°°μ΄μ²λΌ μΈλ±μ€λ‘ λ¬Έμμ΄μ κ° λ¬Έμμ μ κ·Όμ΄ κ°λ₯νλ€.
console.log(str[0]) // 's'
console.log(str[2]) // 'a'
νμ§λ§ λ°°μ΄κ³Όλ λ¬λ¦¬ μΈλ±μ€μ μ§μ λ€λ₯Έ λ¬Έμλ₯Ό ν λΉνμ¬ κ°μ λ³κ²½ν μλ μλ€. μλ μμ μ½λμ κ°μ΄ λ¬Έμμ΄λ μμ μλ£νμ΄κΈ° λλ¬Έμ κ° λ³κ²½μ΄ λΆκ°νκΈ° λλ¬Έμ΄λ€.
let str = 'μ½λ©μ';
str = 'μ¬λ°μ΄';
str[2] = 'μ';
console.log(str); // μ¬λ°μ΄
λκΈ