λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Front-end/JS

μžλ°”μŠ€ν¬λ¦½νŠΈ μ›μ‹œ νƒ€μž… & 객체 νƒ€μž… Primitive type & Reference type

by ciocio 2021. 8. 12.

πŸ“Œ  μ›μ‹œ νƒ€μž…? 객체 νƒ€μž…?

 

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ œκ³΅ν•˜λŠ” 7가지 데이터 νƒ€μž…λ“€μ„ 크게

μ›μ‹œ νƒ€μž…primitive typeκ³Ό 객체 νƒ€μž…object/reference type으둜 ꡬ뢄할 수 μžˆλ‹€.

 

 

πŸ“Œ  μ›μ‹œ νƒ€μž…κ³Ό 객체 νƒ€μž… νŠΉμ§•

 

πŸ’‘ μ›μ‹œ νƒ€μž… primitive type νŠΉμ§•

 

 01  μ›μ‹œ 값은 "λ³€κ²½ λΆˆκ°€λŠ₯"ν•œ 값이닀.  -->  immutable value  -->  λ°μ΄ν„°μ˜ 신뒰성을 보μž₯ν•œλ‹€.

 02  μ›μ‹œ 값을 λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄, λ³€μˆ˜ (ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간) μ—λŠ” μ‹€μ œ 값이 μ €μž₯λœλ‹€.

 

 

μ›μ‹œ 값이 λ³€ν•˜μ§€ μ•ŠλŠ” 건 μ‚¬μ‹€μ΄μ§€λ§Œ, λ³€μˆ˜μ— μ €μž₯된 μ›μ‹œ 값은 μž¬ν• λ‹Ήμ„ 톡해 μƒˆλ‘œμš΄ 값을 쀄 수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이 κ²½μš°λ„ μ›λž˜ λ³€μˆ˜μ— ν• λ‹Ήλœ μ›μ‹œ 값을 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ κ΅μ²΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ,

λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λ˜ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό λ³€κ²½ν•΄ μƒˆλ‘­κ²Œ ν• λ‹Ήλœ 값을 μ €μž₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

-->  μ΄λŸ¬ν•œ νŠΉμ„±μ„ 'λΆˆλ³€μ„±'immutability라 ν•œλ‹€.

-->  μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 이외에 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법은 μ—†λ‹€.

 

const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœλ‹€. μƒμˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜μΌ 뿐이닀.

const o = {};

// const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έν•œ λ³€μˆ˜μ— ν• λ‹Ήν•œ μ›μ‹œ 값은 λ³€κ²½ν•  수 μ—†λ‹€.
// ν•˜μ§€λ§Œ !! const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έν•œ λ³€μˆ˜μ— μ°Έμ‘° κ°’(ex.객체)은 λ³€κ²½ν•  수 μžˆλ‹€.

o.a = 1;
console.log(o);  // {a: 1}

 

 

πŸ“  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ¬Έμžμ—΄ νŠΉμ§•

 

λ¬Έμžμ—΄μ€ 0개 μ΄μƒμ˜ '문자'둜 이뀄진 집합을 λ§ν•œλ‹€.

1개의 λ¬ΈμžλŠ” 2λ°”μ΄νŠΈ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯되기 λ•Œλ¬Έμ—,

λͺ‡ 개의 문자둜 μ΄λ€„μ‘ŒλŠλƒμ— 따라 ν•„μš”ν•œ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기가 κ²°μ •λœλ‹€.

이 같은 이유둜 Cμ—λŠ” ν•˜λ‚˜μ˜ 문자λ₯Ό μœ„ν•œ 데이터 νƒ€μž… ( char ) 만 μžˆμ„ 뿐 λ¬Έμžμ—΄ νƒ€μž…μ€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

Cμ—μ„œλŠ” λ¬Έμžμ—΄μ€ 문자의 λ°°μ—΄λ‘œ μ²˜λ¦¬ν•˜κ³ , μžλ°”μ—μ„œλŠ” λ¬Έμžμ—΄μ„ String 객체둜 μ²˜λ¦¬ν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 개발자의 편의λ₯Ό μœ„ν•΄ λ¬Έμžμ—΄ νƒ€μž…μ„ μ›μ‹œ νƒ€μž…μœΌλ‘œ μ œκ³΅ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.

 

// μœ μ‚¬ λ°°μ—΄ 객체 
// --> 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 μžˆλ‹€.
// --> length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€.

var str = 'string'

// λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄μ΄λ―€λ‘œ, λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ 인덱슀λ₯Ό μ‚¬μš©ν•΄ 각 λ¬Έμžμ— μ ‘κ·Όν•  수 μžˆλ‹€.

console.log(str[0]);  // s

// λ¬Έμžμ—΄μ€ μ›μ‹œ 값인데, 객체처럼 λ™μž‘ν•œλ‹€.

console.log(str.length);  // 6
console.log(str.toUpperCase());  // STRING

 

 

 

πŸ’‘ 객체 νƒ€μž… object/reference type νŠΉμ§•

 

 01  객체(μ°Έμ‘°) νƒ€μž…μ˜ 값은 "λ³€κ²½ κ°€λŠ₯"ν•œ 값이닀.  -->  mutable value

 02  객체(μ°Έμ‘°) νƒ€μž…μ˜ 값을 λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄, λ³€μˆ˜ (ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간) μ—λŠ” μ°Έμ‘° 값이 μ €μž₯λœλ‹€.

 

 

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

즉, μž¬ν• λ‹Ήμ—†μ΄ ν”„λ‘œνΌν‹°λ₯Ό λ™μ μœΌλ‘œ μΆ”κ°€ν•  μˆ˜λ„ 있고, ν”„λ‘œνΌν‹° 값을 κ°±μ‹ ν•  μˆ˜λ„ 있으며, ν”„λ‘œνΌν‹° 자체λ₯Ό μ‚­μ œν•  μˆ˜λ„ μžˆλ‹€.

 

// 할당이 μ΄λ€„μ§€λŠ” μ‹œμ μ— 객체 λ¦¬ν„°λŸ΄μ΄ ν•΄μ„λ˜κ³ , κ·Έ κ²°κ³Ό 객체가 μƒμ„±λœλ‹€.

var person = {
  name: 'Lee'
};

// person λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μ°Έμ‘° κ°’μœΌλ‘œ μ‹€μ œ 객체에 μ ‘κ·Όν•œλ‹€.

console.log(person);  // {name: "Lee"}

 

객체λ₯Ό λ³€κ²½ν•  λ•Œλ§ˆλ‹€ μ›μ‹œ κ°’μ²˜λŸΌ 이전 값을 λ³΅μ‚¬ν•΄μ„œ μƒˆλ‘­κ²Œ μƒμ„±ν•œλ‹€λ©΄, λͺ…ν™•ν•˜κ³  신뒰성이 ν™•λ³΄λ˜κ² μ§€λ§Œ

κ°μ²΄λŠ” 크기가 맀우 클 μˆ˜λ„μžˆκ³ , μ›μ‹œ κ°’μ²˜λŸΌ 크기가 μΌμ •ν•˜μ§€λ„ μ•ŠμœΌλ©°, ν”„λ‘œνΌν‹° 값이 객체일 μˆ˜λ„ μžˆμ–΄μ„œ

λ³΅μ‚¬ν•΄μ„œ μƒμ„±ν•˜λŠ” λΉ„μš©μ΄ 많이 λ“ λ‹€. λ‹€μ‹œ 말해, λ©”λͺ¨λ¦¬μ˜ 효율적 μ†ŒλΉ„κ°€ μ–΄λ ΅κ³  μ„±λŠ₯이 λ‚˜λΉ μ§„λ‹€.

 

λ”°λΌμ„œ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄,

객체λ₯Ό λ³΅μ‚¬ν•˜κ³  μƒμ„±ν•˜λŠ” λΉ„μš©μ„ μ ˆμ•½ν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄,

κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ κ°’μœΌλ‘œ μ„€κ³„λ˜μ–΄ μžˆλ‹€.

λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©μ˜ νš¨μœ¨μ„±κ³Ό μ„±λŠ₯을 μœ„ν•΄ ꡬ쑰적인 단점을 κ°μ•ˆν•œ 섀계라고 ν•  수 μžˆλ‹€.

 

κ°μ²΄λŠ” μ΄λŸ¬ν•œ ꡬ쑰적 단점에 λ”°λ₯Έ λΆ€μž‘μš©μ΄ (λ‹Ήμ—°νžˆ) μžˆλ‹€.

μ›μ‹œ κ°’κ³Ό λ‹€λ₯΄κ²Œ, μ—¬λŸ¬ 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό 곡유(μ°Έμ‘° κ°’ 곡유)ν•  수 μžˆλ‹€λŠ” 것이닀.

 

const person = {
  name: 'Lee'
};

// μ°Έμ‘° κ°’(μ£Όμ†Œ κ°’)을 볡사
const copy = person;
console.log(copy === person)  // true

 

원본 personκ³Ό 사본 copyλŠ” μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” λ‹€λ₯΄μ§€λ§Œ, λ™μΌν•œ μ°Έμ‘° 값을 κ°–λŠ”λ‹€.

λ‹€μ‹œ 말해 원본 personκ³Ό 사본 copy λͺ¨λ‘ λ™μΌν•œ 객체λ₯Ό 가리킨닀.  -->  2개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•œλ‹€.

λ”°λΌμ„œ 원본 λ˜λŠ” 사본 쀑 μ–΄λŠ ν•œμͺ½μ—μ„œ 객체λ₯Ό λ³€κ²½ν•˜λ©΄ μ„œλ‘œ 영ν–₯을 μ£Όκ³ λ°›λŠ”λ‹€.

 

 

πŸ“  얕은 볡사 vs κΉŠμ€ 볡사

 

// 객체λ₯Ό ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ κ°–λŠ” 객체의 경우
const o = {x:{y:1}};

// 얕은 볡사 : ν•œ λ‹¨κ³„κΉŒμ§€λ§Œ 볡사 (μ€‘μ²©λœ κ°μ²΄λŠ” μ°Έμ‘° 값을 볡사)
const c1 = {...o};
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

 

 

πŸ“Œ  (ν•„μˆ˜) μ°Έκ³  자료

 

2022.02.15 - [Front-end/JS] - μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ data λ₯Ό μ €μž₯ν•˜λŠ” 방법 (λ©”λͺ¨λ¦¬ μ €μž₯ 방식)

 

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ data λ₯Ό μ €μž₯ν•˜λŠ” 방법 (λ©”λͺ¨λ¦¬ μ €μž₯ 방식)

πŸ“ 당신이 μ„ μ–Έν•œ λ³€μˆ˜λŠ” μŠ€μŠ€λ‘œμ—κ²Œ ν• λ‹Ήλœ 값을 λͺ¨ λ₯Έ λ‹€. μš°λ¦¬κ°€ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ³  μ§€μ •ν•˜λŠ” λͺ¨λ“  것은 "μ‹λ³„μž"이닀. μ‹λ³„μžλž€, λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” μ–΄λ–€ κ°’을 κ΅¬λ³„(식별)ν•΄ λ‚Ό 수

code-designer.tistory.com

 

λ°˜μ‘ν˜•

λŒ“κΈ€