πŸ“Œ 11μž₯ μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ

경이·2022λ…„ 2μ›” 23일
0


μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” λ°μ΄ν„°νƒ€μž…μ€ μ›μ‹œνƒ€μž…κ³Ό 객체 νƒ€μž…μ΄ μžˆλ‹€. 두 νƒ€μž…μ˜ 차이점은 크게 λ‹€μŒ μ„Έ 가지가 μžˆλ‹€.

  • μ›μ‹œ νƒ€μž…μ˜ κ°’, 즉 μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이고 객체(μ°Έμ‘°)νƒ€μž…μ˜ κ°’. 즉 κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 값이닀.
  • μ›μ‹œ 값을 λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜(ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간)μ—λŠ” μ‹€μ œ 값이 μ €μž₯λœλ‹€. 이에 λΉ„ν•΄ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜(ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간)μ—λŠ” μ°Έμ‘° 값이 μ €μž₯λœλ‹€.
  • μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. 이λ₯Ό 값에 μ˜ν•œ 전달이라 ν•œλ‹€. 이에 λΉ„ν•΄ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. 이λ₯Ό 참쑰에 μ˜ν•œ 전달이라고 ν•œλ‹€.

11.1 μ›μ‹œ κ°’

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

μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이닀.

λ³€μˆ˜λŠ” μ–Έμ œλ“ μ§€ μž¬ν• λ‹Ήμ„ 톡해 λ³€μˆ˜ 값을 λ³€κ²½(μ—„λ°€νžˆ λ§ν•˜μžλ©΄ ꡐ체)ν•  수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ³€μˆ˜λΌκ³  λΆ€λ₯Έλ‹€. μƒμˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜μΌ 뿐이닀.

μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜μ— μƒˆλ‘œμš΄ μ›μ‹œ 값을 μž¬ν• λ‹Ήν•˜λ©΄ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” μž¬ν• λ‹Ή μ΄μ „μ˜ μ›μ‹œ 값을 λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μž¬ν• λ‹Ήν•œ μ›μ‹œ 값을 μ €μž₯ν•œ ν›„, λ³€μˆ˜λŠ” μƒˆλ‘­κ²Œ μž¬ν• λ‹Ήν•œ μ›μ‹œ 값을 가리킨닀. μ΄λŸ¬ν•œ νŠΉμ„±μ„Β λΆˆλ³€μ„±μ΄λΌκ³  ν•œλ‹€. λΆˆλ³€μ„±μ„ κ°–λŠ” μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λŠ”Β μž¬ν• λ‹Ή 이외에 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법이 μ—†λ‹€

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

μžλ°”μŠ€ν¬λ¦¬λΈŒλŠ” μ›μ‹œ νƒ€μž…μ˜ λ¬Έμžμ—΄μ„ μ œκ³΅ν•œλ‹€. λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄ κ°μ²΄λ‘œμ„œ λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ 각 λ¬Έμžμ— μ ‘κ·Όν•  수 μžˆμœΌλ‚˜ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이기 λ•Œλ¬Έμ— 일뢀 문자λ₯Ό 변경해도 λ°˜μ˜λ˜μ§€ μ•ŠλŠ”λ‹€. μ›μ‹œ νƒ€μž…μΈ λ¬Έμžμ—΄μ€ 읽기 μ „μš©μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

  var str = 'string';

  // λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄μ΄λ―€λ‘œ λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ 인덱슀λ₯Ό μ‚¬μš©ν•΄ 각 λ¬Έμžμ— μ ‘κ·Όν•  수 μžˆλ‹€.
  // ν•˜μ§€λ§Œ λ¬Έμžμ—΄μ€ μ›μ‹œκ°’μ΄λ―€λ‘œ λ³€κ²½ν•  수 μ—†λ‹€. μ΄λ•Œ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
  str[0] = 'S';

  console.log(str); // string

11.1.3 값에 μ˜ν•œ 전달

λ³€μˆ˜μ— μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄ ν• λ‹Ήλ°›λŠ” λ³€μˆ˜μ—λŠ” ν• λ‹Ήλ˜λŠ” λ³€μˆ˜μ˜ μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬ν•œλ‹€. 이λ₯Ό 값에 μ˜ν•œ 전달이라 ν•œλ‹€. μ—„κ²©ν•˜κ²Œ ν‘œν˜„ν•˜λ©΄ 값이 μ „λ‹¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ΄λŠ” λ³€μˆ˜μ™€ 같은 μ‹λ³„μžλŠ” 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•˜κ³  있기 λ•Œλ¬Έμ΄λ‹€.

이처럼 β€œκ°’μ— μ˜ν•œ 전달”도 사싀은 값을 μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•œλ‹€. 단 μ „λ‹¬λœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•˜λ©΄ 값을 μ°Έμ‘°ν•  수 μžˆλ‹€.

λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•˜κ²Œ 되면 두 λ³€μˆ˜μ˜ μ›μ‹œ 값은 μ„œλ‘œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ 값이 λ˜μ–΄ μ–΄λŠ ν•œμͺ½μ—μ„œ μž¬ν• λ‹Ήμ„ 톡해 값을 λ³€κ²½ν•˜λ”λΌλ„ μ„œλ‘œ κ°„μ„­ν•  수 μ—†λ‹€.

11.2 객체

κ°μ²΄λŠ” μ›μ‹œ κ°’κ³Ό 같이 확보해야할 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό 사전에 μ •ν•΄ λ‘˜ 수 μ—†κ³  볡합적인 μžλ£Œκ΅¬μ‘°μ΄λ‹€. λ”°λΌμ„œ κ°μ²΄λŠ” μ›μ‹œ κ°’κ³ΌλŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€.

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

μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μ΄λ―€λ‘œ μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λ €λ©΄ μž¬ν• λ‹Ή μ™Έμ—λŠ” 방법이 μ—†λ‹€. ν•˜μ§€λ§Œ κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 값이닀. λ”°λΌμ„œ 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 없이 객체λ₯Ό 직접 λ³€κ²½ν•  수 μžˆλ‹€. 즉, μž¬ν• λ‹Ή 없이 ν”„λ‘œνΌν‹°λ₯Ό λ™μ μœΌλ‘œ μΆ”κ°€ν•  μˆ˜λ„ 있고 ν”„λ‘œνΌν‹° 값을 κ°±μ‹ ν•  μˆ˜λ„ 있으며 ν”„λ‘œνΌν‹° 자체λ₯Ό μ‚­μ œν•  μˆ˜λ„μžˆλ‹€.

κ°μ²΄λŠ” λ©”λͺ¨λ¦¬λ₯Ό λ³΅μ‚¬ν•΄μ„œ μƒμ„±ν•˜κ²Œ 되면 λ©”λͺ¨λ¦¬μ˜ 효율이 많이 떨어지기 λ•Œλ¬Έμ— κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ κ°’μœΌλ‘œ μ„€κ³„λ˜μ–΄ μžˆλ‹€. μ΄λŸ¬ν•œ κ΅¬μ‘°μ—λŠ” λΆ€μž‘μš©μ΄ μ‘΄μž¬ν•˜λŠ”λ° 그것은 μ›μ‹œ κ°’κ³ΌλŠ” λ‹€λ₯΄κ²Œ μ—¬λŸ¬ 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€λŠ” 것이닀.

🧐 얕은볡사와 κΉŠμ€λ³΅μ‚¬

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

// 얕은 볡사
const c1 = { ...o }; // 35μž₯ "μŠ€ν”„λ ˆλ“œ 문법" μ°Έκ³ 
console.log(c1 === o); // false
console.log(c1.x === o.x); // true

// lodash의 cloneDeep을 μ‚¬μš©ν•œ κΉŠμ€ 볡사
// "npm install lodash"둜 lodashλ₯Ό μ„€μΉ˜ν•œ ν›„, Node.js ν™˜κ²½μ—μ„œ μ‹€ν–‰
const _ = require('lodash');
// κΉŠμ€ 볡사
const c2 = _.cloneDeep(o);
console.log(c2 === o); // false
console.log(c2.x === o.x); // false

const v = 1;

// "κΉŠμ€ 볡사"라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.
const c1 = v;
console.log(c1 === v); // true

const o = { x: 1 };

// "얕은 볡사"라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.
const c2 = o;
console.log(c2 === o); // true

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

var person = {
  name: 'Lee'
};

// 참쑰값을 볡사(얕은 볡사)
var copy = person;

μœ„μ˜ μ½”λ“œμ—μ„œ personκ³Ό copy λͺ¨λ‘ λ™μΌν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ”λ° μ΄λŠ” 두 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•œλ‹€λŠ”κ²ƒμ„ μ˜λ―Έν•œλ‹€.

profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보