ν‹°μŠ€ν† λ¦¬ λ·°

μ›μ‹œκ°’κ³Ό 객체의 차이점

μ›μ‹œκ°’κ³Ό 객체의 νŠΉμ§•μ„ μžμ„Ένžˆ μ•Œμ•„λ³΄κΈ° μ•žμ„œ 차이점을 ν‘œλ‘œ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ›μ‹œκ°’ 객체 νƒ€μž…
λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’ λ³€κ²½ κ°€λŠ₯ν•œ κ°’
λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜μ— μ‹€μ œ 값이 μ €μž₯됨 λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜μ— μ°Έμ‘°κ°’이 μ €μž₯됨
λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ 전달 λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ 전달(참쑰에 μ˜ν•œ 전달)

 

μ›μ‹œ κ°’μ˜ νŠΉμ§•

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

ν•œλ²ˆ μƒμ„±λœ μ›μ‹œ 값은 읽기 μ „μš©κ°’μœΌλ‘œ μ›μ‹œ νƒ€μž…μ˜ 값은 변경이 λΆˆκ°€λŠ₯ν•œ κ°’μž…λ‹ˆλ‹€.

값은 λ³€μˆ˜μ— μ €μž₯된 λ°μ΄ν„°λ‘œμ„œ ν‘œν˜„μ‹μ΄ ν‰κ°€λ˜μ–΄ μƒμ„±λœ κ²°κ³Όλ₯Ό λ§ν•˜κΈ° λ•Œλ¬Έμ— λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 것은 λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ μ›μ‹œ κ°’ 자체λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ λΆˆλ³€μ„±μ„ κ°–λŠ” μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 이외에 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€.

 

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

μ›μ‹œ 값을 μ €μž₯ν•˜λ €λ©΄ λ¨Όμ € 확보해야 ν•˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό κ²°μ •ν•΄μ•Ό ν•˜λŠ”λ°, λ¬Έμžμ—΄μ€ 0개 μ΄μƒμ˜ 문자둜 이루어진 집합이기 λ•Œλ¬Έμ— λͺ‡ 개의 문자(1개 λ¬ΈμžλŠ” 2λ°”μ΄νŠΈ)둜 μ΄λ€„μ‘Œλƒμ— 따라 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기가 κ²°μ •λ©λ‹ˆλ‹€.

 

λ˜ν•œ, μ•„λž˜μ™€ 같이 str을 μˆ˜μ •ν•œλ‹€λ©΄ 'world'λΌλŠ” μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ©”λͺ¨λ¦¬μ— μƒμ„±ν•˜κ³  μ‹λ³„μž str은 이것을 κ°€λ₯΄ν‚€κ²Œ λ©λ‹ˆλ‹€.

var str = 'Hello';
str = 'world'; // κ°’μ˜ μž¬ν• λ‹Ή

 

λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ―€λ‘œ λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ 각 λ¬Έμžμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, λ¬Έμžμ—΄μ€ 읽기 μ „μš© κ°’μœΌλ‘œ λ³€κ²½ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같이 변경을 해도 λ°˜μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

var str = 'string';

str[0] = 'S'; // μœ μ‚¬ 배열이기 λ•Œλ¬Έμ— index둜 μ ‘κ·Ό κ°€λŠ₯
console.log(str); // "string"

 

값에 μ˜ν•œ 전달

μ•„λž˜μ˜ μ˜ˆμ‹œμ™€ 같이 κ°’μ˜ 전달은 λ³€μˆ˜μ— μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄ ν• λ‹Ήλ°›λŠ” λ³€μˆ˜(copy)μ—λŠ” ν• λ‹Ήλ˜λŠ” λ³€μˆ˜(score)의 μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

var score = 80; // 80
var copy = score; // 80

score = 100;

console.log(score); // 100
console.log(copy); // 80

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

 

λ”°λΌμ„œ μœ„μ˜ μ˜ˆμ‹œμ—μ„œ scoreλ³€μˆ˜μ™€ copyλ³€μˆ˜μ˜ κ°’ 80은 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ κ°’μœΌλ‘œ score의 값을 λ³€κ²½ν•˜λ”λΌλ„ μ„œλ‘œ κ°„μ„­λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

** μ „λ‹¬λœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•˜λ©΄ 값을 μ°Έμ‘°ν•  μˆ˜λ„ 있음

 

객체의 νŠΉμ§•

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

μ°Έμ‘°κ°’μ΄λž€ 객체λ₯Ό ν• λ‹Ήν•˜λ©΄ λ³€μˆ˜μ—λŠ” μƒμ„±λœ 객체가 μ‹€μ œλ‘œ μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œκ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 객체(μ°Έμ‘°)νƒ€μž…μ˜ 값은 λ³€κ²½ κ°€λŠ₯ν•œ κ°’μœΌλ‘œ, 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•˜λ©΄ 참쑰값에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ κ°μ²΄λŠ” ν”„λ‘œνΌν‹°μ˜ κ°œμˆ˜κ°€ μ •ν•΄μ Έ μžˆμ§€ μ•Šκ³  λ™μ μœΌλ‘œ μΆ”κ°€λ˜κ³  μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ›μ‹œ κ°’κ³Ό λ‹€λ₯΄κ²Œ 확보해야할 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό 사전에 μ •ν•΄ λ‘˜ 수 μ—†λ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

 

// 할당이 μ΄λ€„μ§€λŠ” μ‹œμ μ— 객체 λ¦¬ν„°λŸ΄μ΄ ν•΄μ„λ˜κ³  객체가 생성
var person = {
    name: 'Lee'
};

// person λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ μž‡λŠ” μ°Έμ‘° κ°’μœΌλ‘œ μ‹€μ œ 객체에 μ ‘κ·Ό
console.log(person); // {name: "Lee"}

person.name = 'Kim'; // ν”„λ‘œνΌν‹° κ°’ κ°±μ‹ 
person.address = 'Seoul'; // ν”„λ‘œνΌν‹° 동적 생성

console.log(person); // {name: "Kim", address: "Seoul"}

μœ„μ˜ μ˜ˆμ‹œμ™€ 같이 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 없이 객체λ₯Ό 직접 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜μ— μž¬ν• λ‹Ήμ„ ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜μ˜ μ°Έμ‘° 값은 λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ λ³€κ²½ κ°€λŠ₯ν•œ κ°’μ—λŠ” μž₯단점이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

  • μž₯점 : 객체λ₯Ό 볡사해 μƒμ„±ν•˜λŠ” λΉ„μš©μ„ μ ˆμ•½ν•΄ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš© κ°€λŠ₯ (μ›μ‹œ 값에 λΉ„ν•΄ κ°μ²΄λŠ” 크기가 맀우 컀질수 있음)
  • 단점 : μ—¬λŸ¬ 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•  수 있음

 

 

 

참쑰에 μ˜ν•œ 전달

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

var person = {
    name: 'Lee'
};

// μ°Έμ‘° 값을 볡사(얕은 볡사)
var copy = person;

// copy와 person은 λ™μΌν•œ μ°Έμ‘° 값을 가짐
console.log(person === copy); // true

copy.name = 'Kim';
person.address = 'Seoul';

console.log(person); // {name: "Kim", address: "Seoul"}
console.log(copy); // {name: "Kim", address: "Seoul"}

μœ„μ˜ μ˜ˆμ‹œμ™€ 같이 원본 personκ³Ό 사본 copyλŠ” μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” λ‹€λ₯΄μ§€λ§Œ λ™μΌν•œ μ°Έμ‘° 값을 κ°€μ§€κ²Œ 되고, 이λ₯Ό 두 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•œλ‹€κ³  이야기 ν•©λ‹ˆλ‹€.

 

κ²°κ΅­ "값에 μ˜ν•œ 전달"κ³Ό "참쑰에 μ˜ν•œ 전달"은 μ‹λ³„μžκ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” 값을 λ³΅μ‚¬ν•΄μ„œ μ „λ‹¬ν•˜λŠ” λ©΄μ—μ„œλŠ” λ™μΌν•˜μ§€λ§Œ, λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 값이 μ›μ‹œ 값이냐 μ°Έμ‘° κ°’μ΄λƒμ˜ 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr