πŸ† Javascript(0) 데이터 νƒ€μž…, λ³€μˆ˜ μ„ μ–Έ

Lee JooamΒ·2022λ…„ 4μ›” 26일
0

제일 처음 배운 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” Cμ–Έμ–΄μ˜€λ‹€. Cμ–Έμ–΄λŠ” 데이터 νƒ€μž…μ— λŒ€ν•΄ ꡉμž₯히 μ—„κ²©ν•œλ°, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 그런 C언어와 사뭇 λ‹€λ₯΄λ‹€.

μš°μ„  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 데이터 νƒ€μž…μ„ 크게 두 κ°€μ§€λ‘œ λ‚˜λˆ λ³΄κ² λ‹€.

μ›μ‹œνƒ€μž…(primitive)

μ›μ‹œνƒ€μž…μ€ 말 κ·ΈλŒ€λ‘œ 객체가 μ•„λ‹ˆκ³  λ©”μ†Œλ“œλ„ 가지지 μ•ŠλŠ” ν˜•νƒœμ΄λ‹€.

number, string, boolean, undefined, null, bigint, symbol

총 7κ°€μ§€μ˜ νƒ€μž…μ΄ 있으며 이 값듀은 λͺ¨λ‘ λΆˆλ³€(immutable)ν•˜λ‹€.

ν•˜μ§€λ§Œ 보톡 λ³€μˆ˜κ°€ μƒμˆ˜λ‘œ μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ 값을 λ°”κΏ€ 수 μžˆλ‹€. μ›μ‹œ νƒ€μž…μ΄ λΆˆλ³€ν•˜λ‹€λŠ” 말은 무슨 뜻일까?

let a = 3;
a = 5;

λ‹€μŒκ³Ό 같은 λ¬Έμž₯이 μžˆμ„ λ•Œ λ³€μˆ˜ a의 값은 5둜 λ³€ν•˜κ²Œ λœλ‹€.

ν•˜μ§€λ§Œ 이것은 κ°’ μžμ²΄κ°€ λ³€ν•œ 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  κ·Έ μ•ˆμ— 5λΌλŠ” 값을 μ €μž₯ν•œ ν˜•νƒœλ‹€.

또 μ›μ‹œνƒ€μž…μ€ λ©”μ†Œλ“œλ₯Ό 가지지 μ•ŠλŠ” ν˜•νƒœλΌκ³  λ§ν–ˆλ‹€.

const str = "Hello";
console.log(str.length);

ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같이 String의 κΈ°λ³Έ 속성인 lengthλ₯Ό λΉ„λ‘―ν•œ λ‹€μ–‘ν•œ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

이것은 μ›μ‹œ 래퍼 κ°μ²΄λΌλŠ” 것 λ•Œλ¬ΈμΈλ°, nullκ³Ό undefinedλ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ μ›μ‹œ 객체둜 감싸져 있기 λ•Œλ¬Έμ— κΈ°λ³Έ λ©”μ†Œλ“œλ“€μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μ°Έμ‘°νƒ€μž…(reference)

μ°Έμ‘° νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™λ‹€.

const arr = [1,2,3,4];

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜μ— λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  λ•Œ 데이터 νƒ€μž…μ— 따라 λ©”λͺ¨λ¦¬μ˜ 두 뢀뢄인 μŠ€νƒκ³Ό νž™μ— λ‹€λ₯΄κ²Œ ν• λ‹Ήλœλ‹€.

μŠ€νƒμ—λŠ” μ›μ‹œνƒ€μž…λ“€μ΄ μ €μž₯되고 νž™μ—λŠ” 객체처럼 μ°Έμ‘°νƒ€μž…μ˜ 데이터가 μ €μž₯λœλ‹€.

그리고 μ°Έμ‘° νƒ€μž… λ°μ΄ν„°μ˜ 포인터가 μŠ€νƒμ—μ„œ ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜λŠ” ν˜•μ‹μ΄λ‹€.

μ˜ˆμ „μ— νž™μ€ 동적 데이터λ₯Ό ν• λ‹Ήν•˜λŠ” 곡간이라고 λ°°μ› λŠ”λ°, μ•„λ§ˆ λ°°μ—΄κ³Ό 객체같은 μš”μ†Œλ“€μ€ 크기가 λ™μ μœΌλ‘œ λ³€ν•˜κΈ° λ•Œλ¬Έμ— νž™μ— ν• λ‹Ήλ˜λŠ” 것 κ°™λ‹€.

μ›μ‹œνƒ€μž…μ„ μ œμ™Έν•œ 거의 λͺ¨λ“  데이터 νƒ€μž…λ“€μ΄ μ°Έμ‘°νƒ€μž…μ΄λ‹€. 심지어 ν•¨μˆ˜λ„ μ°Έμ‘°νƒ€μž…μ΄λ‹€.

function changeNumber(number) {
  number += 3;
  console.log("print in function: ", number);
}

function changeArr(arr) {
  arr.push("World!!");
  console.log("print in function: ", arr);
}

let number = 3;
const arr = ["Hello"];

changeNumber(number);
changeArr(arr);

console.log(number);
console.log(arr);
print in function:  6
print in function:  [ 'Hello', 'World!!' ]
3
[ 'Hello', 'World!!' ]

λ‹€μŒκ³Ό 같이 ν•¨μˆ˜μ˜ 인자둜 μ›μ‹œ, μ°Έμ‘° νƒ€μž…μ˜ 데이터λ₯Ό λ„˜κΈΈ λ•Œλ„ λ‘˜μ˜ 차이가 λ‚˜νƒ€λ‚œλ‹€.

μ°Έμ‘° νƒ€μž…μ€ 참쑰된 λ©”λͺ¨λ¦¬μ˜ 포인터가 μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— μˆ˜μ • 사항이 외뢀에도 λ°˜μ˜λ˜μ§€λ§Œ, μ›μ‹œ νƒ€μž…μ€ κ°’μ˜ 볡사본이 λ„˜κ²¨μ§€κΈ° λ•Œλ¬Έμ— 외뢀에 λ³€ν™”κ°€ μ—†λ‹€.

var, const, let

μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό κ³΅λΆ€ν•˜λ‹€λ³΄λ©΄ ν˜Έμ΄μŠ€νŒ…μ΄λΌλŠ” 말을 많이 λ³Έλ‹€. ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ˜ 선언을 μœ νš¨λ²”μœ„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” 것인데, μ΄λ•Œ 할당은 이루어지지 μ•ŠλŠ”λ‹€.

var, const, let의 λšœλ ·ν•œ μ°¨μ΄λŠ” μŠ€μ½”ν”„μ—μ„œ λ‚˜νƒ€λ‚œλ‹€. varλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„, const와 let은 블둝 μŠ€μ½”ν”„μ΄λ‹€.

그리고 varλŠ” λ³€μˆ˜ μ„ μ–Έ 이전에 μ‚¬μš©ν•΄λ„ μ—λŸ¬κ°€ λ‚˜μ§€ μ•Šμ§€λ§Œ let, constλŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€. 마치 ν˜Έμ΄μŠ€νŒ…μ΄ λ˜μ§€ μ•ŠλŠ” 것 κ°™λ‹€.

λ˜ν•œ varλŠ” 같은 μ΄λ¦„μœΌλ‘œ λ³€μˆ˜μ˜ μž¬μ„ μ–Έμ΄ κ°€λŠ₯ν•˜λŠ” λ“± λ‹€μ–‘ν•œ λ©΄μ—μ„œ λŠμŠ¨ν•˜κ²Œ λŠκ»΄μ§€λŠ”λ°, μ΄λ ‡κ²Œ λ•Œλ¬Έμ— μ§€κΈˆμ€ μ‚¬μš©μ΄ ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

function outer() {
  const a = 5;
  let b = 3;

  function inner() {
    console.log(a);
    console.log(b);
    let b = 5;
    const a = 3;
  }

  inner();
  console.log(a);
  console.log(b);
}

outer();

μœ„μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 선언듀은 ν˜Έμ΄μŠ€νŒ… λœλ‹€κ³  λ§ν–ˆλ‹€. ν•˜μ§€λ§Œ letκ³Ό constλŠ” 보톡 ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•ŠλŠ”λ‹€κ³  μ•Œλ €μ Έμžˆλ‹€.

μ •ν™•ν•˜κ²Œ λ§ν•˜μžλ©΄ ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ 보인닀.

ReferenceError: Cannot access 'a' before initialization

μœ„μ™€ 같은 μ½”λ“œλŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€. 그리고 κ·Έ μ—λŸ¬μ˜ λ‚΄μš©μ€ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”κ°€ 되기 전에 μ ‘κ·Όν•  수 μ—†λ‹€λŠ” λœ»μ΄λ‹€.

ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜μ— μ°Έμ‘°ν•  수 μžˆμ„ 텐데 μ™œ 그럴까?

μ—¬κΈ°μ„œ μƒˆλ‘œμš΄ κ°œλ…μ΄ λ‚˜μ˜¨λ‹€.

TDZ(Temporal Dead Zone)

TDZλŠ” let, const, class ν˜•νƒœμ˜ 데이터 μ„ μ–Έ 전에 μ ‘κ·Όν•˜λŠ” 것을 λ§‰λŠ” κ°œλ…μ΄λ‹€. μœ„μ˜ μ½”λ“œμ—μ„œ inner ν•¨μˆ˜λ₯Ό 호좜 μ‹œ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것도 TDZ λ•Œλ¬Έμ΄λ‹€.

class Vehicle {
  constructor(type, wheel) {
    this.type = type;
    this.wheel = wheel;
  }
}

class Car extends Vehicle {
  constructor(type, wheel, owner) {
    super(type, wheel);
    this.owner = owner;
  }
}

const myCar = new Car("truck", "4", "Am");

console.log(myCar);

λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” μ—λŸ¬κ°€ λ‚˜μ§€ μ•Šμ§€λ§Œ

class Car extends Vehicle {
  constructor(type, wheel, owner) {
    this.owner = owner;
    super(type, wheel);
  }
}

μœ„μ™€ 같이 super 이전에 thisλ₯Ό μ°Έμ‘°ν•˜λ €κ³  ν•˜λ©΄ 레퍼런슀 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

이런 ν˜„μƒλ„ TDZ κ°œλ…μ΄ 적용됐기 λ•Œλ¬Έμ΄λ‹€.

profile
ν”„λ‘ νŠΈμ—”λ“œ 개발자둜 κ±Έμ–΄κ°€λŠ” μ€‘μž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€