🌸11μž₯. μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ œκ³΅ν•˜λŠ” 7κ°€μ§€ 데이터 νƒ€μž…(숫자, λ¬Έμžμ—΄, λΆˆλ¦¬μ–Έ, null, undefined, μ‹¬λ²Œ, 객체 νƒ€μž…)은 크게 μ›μ‹œ νƒ€μž…(primitive type)κ³Ό 객체 νƒ€μž…(object/reference type)으둜 ꡬ뢄할 수 μžˆλ‹€. (6μž₯)

βœ…11.1 μ›μ‹œ νƒ€μž…κ³Ό 객체 νƒ€μž…μ˜ λŒ€ν‘œμ μΈ 차이점

  1. μ›μ‹œ νƒ€μž…μ˜ κ°’(==μ›μ‹œ κ°’)은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’(immutable value)

    객체(μ°Έμ‘°) νƒ€μž…μ˜ κ°’(==객체)은 λ³€κ²½ κ°€λŠ₯ν•œ κ°’(mutable value)

  2. μ›μ‹œκ°’μ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜μ—λŠ” μ‹€μ œ 값이 μ €μž₯λœλ‹€.

    객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜μ—λŠ” μ°Έμ‘° 값이 μ €μž₯λœλ‹€.

  3. μ›μ‹œκ°’μ„ κ°–λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ β†’ μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ 전달(값에 μ˜ν•œ 전달. pass by value)

    객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ β†’ μ›λ³Έμ˜ 참쑰값이 λ³΅μ‚¬λ˜μ–΄ 전달(참쑰에 μ˜ν•œ 전달. pass by reference)

βœ…11.2 μ›μ‹œ κ°’

λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’

μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’ == 읽기 μ „μš© 값이닀.

값을 λ³€κ²½ν•  수 μ—†λ‹€λŠ” 의미 μ‚΄νŽ΄λ³΄κΈ°

  • λ³€μˆ˜λŠ” 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 κ·Έ 자체/λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•œ 이름이고 값은 λ³€μˆ˜μ— μ €μž₯된 λ°μ΄ν„°λ‘œμ„œ ν‘œν˜„μ‹μ΄ ν‰κ°€λ˜μ–΄ μƒμ„±λœ κ²°κ³Ό

  • λ”°λΌμ„œ, λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 것은 λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ 값에 λŒ€ν•œ μ§„μˆ μ΄λ‹€.

  • 즉, "μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€."

    • μ›μ‹œ κ°’ 자체λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€. β†’ O

    • λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μ—†λ‹€. β†’ X

μƒμˆ˜ != λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’
-   **μƒμˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜**
-   `λ³€μˆ˜`λŠ” μ–Έμ œλ“ μ§€ μž¬ν• λ‹Ήμ„ 톡해 λ³€μˆ˜ 값을 λ³€κ²½(가리킀고 μžˆλŠ” 곡간값을 ꡐ체) ν•  수 μžˆλ‹€.
-   `μƒμˆ˜`도 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ―€λ‘œ "`λ³€μˆ˜`"라고 ν•  수 μžˆλ‹€.
    ν•˜μ§€λ§Œ, 단 ν•œλ²ˆλ§Œ 할당이 ν—ˆμš©λ˜λ―€λ‘œ **λ³€μˆ˜ 값을 λ³€κ²½(ꡐ체)ν•  수 μ—†λ‹€.**

λΆˆλ³€μ„±μ„ κ°–λŠ” μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜κ°€ λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법은 였직 "μž¬ν• λ‹Ή" 뿐이닀.

μ•„λž˜λŠ” score λ³€μˆ˜κ°€ μ„ μ–Έλ˜κ³  ν• λ‹Ή 된 ν›„ 값이 λ³€κ²½λ˜λŠ” 과정에 λŒ€ν•œ 그림이닀.

  • μ›μ‹œ κ°’ numberλŠ” immutableν•œ κ°’

  • λ”°λΌμ„œ, scoreλŠ” κ°’ 80을 90으둜 λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 90μ΄λΌλŠ” 숫자둜 μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•œ ν›„ λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 곡간 값을 λ°”κΏ”μ€€λ‹€.

λ¬Έμžμ—΄κ³Ό λΆˆλ³€μ„±

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ¬Έμžμ—΄μ€ μ›μ‹œνƒ€μž…μ΄λ©°, λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€.
  • λ¬Έμžμ—΄μ€ κ΅¬μ„±λœ 문자의 κ°œμˆ˜μ— 따라 ν•„μš”ν•œ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기가 λ‹€λ₯΄λ‹€.

  • λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€. λ”°λΌμ„œ λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€.

λ¬Έμžμ—΄μ˜ ν•œ 문자λ₯Ό λ³€κ²½ν•΄ 보면?

var str = "string";
str[0] = "S";

console.log(str); // "string"
  • 'string' μ—μ„œ 첫 번째 's' λ₯Ό 'S' 둜 λ³€κ²½ν•˜λ € ν•˜μ§€λ§Œ str λ³€μˆ˜λŠ” "λ¬Έμžμ—΄, 즉 μ›μ‹œ κ°’"

  • μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’(immutable value) -> 값이 μ—…λ°μ΄νŠΈ λ˜μ§€ μ•ŠλŠ”λ‹€.

  • 참고둜 μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

ν•˜μ§€λ§Œ μ•„λž˜μ²˜λŸΌ μž¬ν• λ‹ΉμœΌλ‘œ 값을 λ³€κ²½ν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

var str = "Hello";
str = "World";

console.log(str); // "World"

@μœ μ‚¬ λ°°μ—΄ 객체

  • λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있고, length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체

  • λ¬Έμžμ—΄ : 인덱슀λ₯Ό 톡해 각 λ¬Έμžμ— μ ‘κ·Ό κ°€λŠ₯. length ν”„λ‘œνΌν‹° 가짐. forλ¬Έ 순회 κ°€λŠ₯

값에 μ˜ν•œ 전달(pass by value)

πŸ‘‰ λ³€μˆ˜μ— μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄, 할당받은 λ³€μˆ˜μ—λŠ” ν• λ‹Ήλ˜λŠ” λ³€μˆ˜μ˜ μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜λŠ” 것

1) λ³€μˆ˜μ— λ³€μˆ˜λ₯Ό ν• λ‹Ήν–ˆμ„ λ•Œ 무엇이 μ–΄λ–»κ²Œ μ „λ‹¬λ κΉŒ?

var score = 80;
var copy = score;

console.log(score, copy); // 80 80
console.log(copy === score); // true
image
  • copy λ³€μˆ˜μ— μ›μ‹œ 값을 κ°–λŠ” score λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄, ν• λ‹Ήλ°›λŠ” λ³€μˆ˜(copy)μ—λŠ” ν• λ‹Ήλ˜λŠ” λ³€μˆ˜(score)의 μ›μ‹œ κ°’ 80이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€.

  • ❗scoreλ³€μˆ˜μ™€ copy λ³€μˆ˜μ˜ κ°’ 80은 λ‹€λ₯Έ λ©”λͺ¨λ¦¬κ³΅κ°„에 μ €μž₯된 λ³„κ°œμ˜ 값이닀.

2) 1 이후 score λ³€μˆ˜μ— μƒˆλ‘œμš΄ 숫자 κ°’ 100을 μž¬ν• λ‹Ήν•˜λ©΄ copy의 값은 μ–΄λ–»κ²Œ 될까?

score = 100;

console.log(score); // 100 (원본 κ°’)
console.log(copy); // 80  (λ³΅μ‚¬ν•œ κ°’)
  • score와 copy λ³€μˆ˜μ˜ 값은 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ 값이기 λ•Œλ¬Έμ—, score λ³€μˆ˜λ₯Ό 변경해도 copy λ³€μˆ˜ κ°’μ—λŠ” μ–΄λ– ν•œ 영ν–₯도 μ£Όμ§€ μ•ŠλŠ”λ‹€.

값에 μ˜ν•œ 전달? μ—„λ°€νžˆ λ§ν•˜λ©΄, 값이 μ•„λ‹Œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 전달

- λ³€μˆ˜μ—λŠ” 값이 μ „λ‹¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ 전달됨
- λ³€μˆ˜μ™€ 같은 "μ‹λ³„μž"λŠ” 값이 μ•„λ‹Œ "λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅"ν•˜κ³  있음
⭐ ν•œ λ³€μˆ˜μ— μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄,
두 λ³€μˆ˜μ˜ μ›μ‹œ κ°’μ€Β μ„œλ‘œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ 값이 λ˜μ–΄, μ–΄λŠ ν•œμͺ½μ—μ„œ μž¬ν• λ‹Ήμ„ 톡해 값을 λ³€κ²½ν•˜λ”λΌλ„ μ„œλ‘œ κ°„μ„­ν•  수 μ—†λ‹€λŠ” 것

βœ…11.3 객체

μžλ°”μŠ€ν¬λ¦½νŠΈ 객체의 관리 방식

  • V8 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—μ„œλŠ” ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ 동적탐색 λŒ€μ‹  νžˆλ“  ν΄λž˜μŠ€λΌλŠ” 방식을 μ‚¬μš©ν•œλ‹€.

λ³€κ²½ κ°€λŠ₯ν•œ κ°’

κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 값이닀.
image
  • 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•˜λ©΄ μ°Έμ‘° 값에 μ ‘κ·Όν•  수 μžˆλ‹€.

    • μ°Έμ‘° κ°’(reference value) : μƒμ„±λœ 객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œ

  • 즉, 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜μ—λŠ” μ°Έμ‘° 값이 μ €μž₯λ˜μ–΄μžˆκ³ , λ³€μˆ˜λŠ” 이 μ°Έμ‘° 값을 톡해 객체에 μ ‘κ·Όν•  수 μžˆλ‹€.

객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 없이 객체λ₯Ό 직접 λ³€κ²½ν•  수 μžˆλ‹€.

  • 즉, μž¬ν• λ‹Ή 없이 ν”„λ‘œνΌν‹° 동적 μΆ”κ°€, ν”„λ‘œνΌν‹° κ°’ κ°±μ‹ , ν”„λ‘œνΌν‹° 자체 μ‚­μ œλ„ κ°€λŠ₯ν•˜λ‹€.

var person = {
    name: "Kwak",
};

// ν”„λ‘œνΌν‹° κ°’ κ°±μ‹ 
person.name = "Kim";

// ν”„λ‘œνΌν‹° κ°’ 동적 μΆ”κ°€
person.address = "Seoul";

console.log(person); // { name: 'Kim', address: 'Seoul' }
  • 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜μ— μž¬ν• λ‹Ήν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—, 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜μ˜ 참쑰값은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€. (μ•„λž˜ κ·Έλ¦Ό μ°Έκ³ )

  • 😭 단점 : μ—¬λŸ¬κ°œμ˜ μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€λŠ” 점

참쑰에 μ˜ν•œ 전달(pass by reference)

πŸ‘‰ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜λŠ” 것

μ—¬λŸ¬κ°œμ˜ μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€.

var person = {
    name: "Lee",
};

// μ°Έμ‘° 값을 볡사(얕은 볡사)
var copy = person;
  • 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜(원본, person)λ₯Ό λ‹€λ₯Έ λ³€μˆ˜(사본, copy)에 ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. β†’ 참쑰에 μ˜ν•œ 전달

image
  • 원본 personκ³Ό 사본 copy λͺ¨λ‘ λ™μΌν•œ 객체λ₯Ό 가리킨닀 == 두 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό 곡유

참쑰에 μ˜ν•œ 전달?

var person = {
    name: "Kwak",
};

// "μ°Έμ‘° κ°’"을 볡사, copy와 person이 λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.
var copy = person;
console.log(copy === person); // true

// copyλ₯Ό 톡해 객체의 name ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½
copy.name = "Kim";

// person을 톡해 객체의 address ν”„λ‘œνΌν‹°λ₯Ό 동적 생성
person.address = "Seoul";

console.log(person); // { name: 'Kim', address: 'Seoul' }
console.log(copy); // { name: 'Kim', address: 'Seoul' }
  • κ²°κ΅­, 값에 μ˜ν•œ 전달과 참쑰에 μ˜ν•œ 전달 은 μ‹λ³„μžκ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” 값을 λ³΅μ‚¬ν•΄μ„œ μ „λ‹¬ν•œλ‹€λŠ” λ©΄μ—μ„œ 동일함

  • 단, λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 값이 μ›μ‹œκ°’μ΄λƒ μ°Έμ‘°κ°’μ΄λƒμ˜ 차이가 μžˆμ„ 뿐

  • λ”°λΌμ„œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” β€œμ°Έμ‘°μ— μ˜ν•œ 전달”은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  말할 수 있음

얕은 볡사 vs κΉŠμ€ 볡사

  • 얕은 볡사(shallow copy) : 객체의 μ€‘μ²©λœ κ°μ²΄λŠ” μ°Έμ‘° 값을 볡사

  • κΉŠμ€ 볡사(deep copy) :객체의 μ€‘μ²©λœ κ°μ²΄κΉŒμ§€ μ›μ‹œ κ°’μ²˜λŸΌ μ™„μ „νžˆ 볡사

const o = { x: { y: 1 } };

// 얕은 볡사
const c1 = { ...o };
console.log(c1 === o); // false
console.log(c1.x === o.x); // true

// κΉŠμ€ 볡사
// lodash의 cloneDeep μ‚¬μš©
const c2 = _.cloneDeep(o);
console.log(c2 === o); // true
console.log(c2.x === o.x); // true

Last updated