[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 11μž₯. μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ

λ…Έμ˜μ™„Β·2023λ…„ 10μ›” 15일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
6/23
post-thumbnail

μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ

μžλ°”μŠ€ν¬λ¦½νŠΈμ— 데이터 νƒ€μž…μ€ 크게 μ›μ‹œ νƒ€μž…, 객체 νƒ€μž…μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€.

μ›μ‹œ νƒ€μž…μ˜ κ°’, 즉 μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’ 반면 객체(μ°Έμ‘°) νƒ€μž…μ˜ 값은 λ³€κ²½ κ°€λŠ₯ν•œ 값이닀.

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

  • μ°Έμ‘° κ°’μ΄λž€? λ³€μˆ˜μ— μ €μž₯된 값을 읽어 λ“€μ΄λŠ” 것 즉, κ°μ²΄λŠ” μ‹€μ œ 값이 μ•„λ‹Œ μ‹€μ œ 값을 κ°€λ₯΄ν‚€λŠ” 값을 μ €μž₯ν•œλ‹€.

1. μ›μ‹œ κ°’

μ›μ‹œ νƒ€μž…μ˜ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’

λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 것은 λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ 값에 λŒ€ν•œ μ§„μˆ μ΄λ‹€. 즉, μ›μ‹œ κ°’ 자체λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€λŠ” 거지 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μ—†λ‹€λŠ” 것은 μ•„λ‹ˆλ‹€.

λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œλ‹€λŠ” 것은 λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간에 값을 ν• λ‹Ήν•œλ‹€. 그리고 λ³€μˆ˜μ— 값을 μ½μ„λ•ŒλŠ” λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λ˜ λ©”λͺ¨λ¦¬ 곡간을 μ½λŠ” 것이닀. 이 λ•Œ μ›μ‹œ νƒ€μž…μ˜ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이기에 μ›μ‹œ νƒ€μž…μ˜ 값을 μž¬ν• λ‹Ήν•˜λŠ” κ΅¬μ‘°μ—μ„œλŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œκ°€ 바뀐닀. μ΄λŸ¬ν•œ νŠΉμ„±μ„ λΆˆλ³€μ„±μ΄λΌν•œλ‹€. λΆˆλ³€μ„±μ„ κ°–λŠ” μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 이외에 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법이 μ—†λ‹€.

πŸ’‘μœ μ‚¬λ°°μ—΄ κ°μ²΄λž€?

πŸ’‘ μœ μ‚¬λ°°μ—΄ κ°μ²΄λž€ 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있고 length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό λ§ν•œλ‹€. λ¬Έμžμ—΄μ€ 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀λ₯Ό 톡해 각 λ¬Έμžμ— μ ‘κ·Όν•  수 있으며, length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— μœ μ‚¬ λ°°μ—΄ 객체이고 for문으둜 μˆœνšŒν•  수 도 μžˆλ‹€.

let str = "string";

// λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄μ΄λ―€λ‘œ λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ 인덱슀λ₯Ό μ‚¬μš©ν•΄ 각 λ¬Έμžμ— μ ‘κ·Όν•  수 μžˆλ‹€.
console.log(str[0]) // s;

// μ›μ‹œ 값인 λ¬Έμžμ—΄μ΄ 객체처럼 λ™μž‘ν•œλ‹€.
console.log(str.length) // 6
console.log(str.toUpperCase()); // STRING

// λ¬Έμžμ—΄μ€ μ›μ‹œ κ°’μ΄λ―€λ‘œ λ³€κ²½ν•  수 μ—†λ‹€. μ΄λ•Œ μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
str[0] = 'S' ;

console.log(str) // string

값에 μ˜ν•œ 전달

var score = 80
var copy = score

console.log(score,copy) // 80, 80

score = 100

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

λ³€μˆ˜μ— λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” 경우, ν• λ‹Ήλ˜λŠ” λ³€μˆ˜(score)κ°€ μ›μ‹œκ°’μ„ κ°–λŠ” λ³€μˆ˜λΌλ©΄ ν• λ‹Ήλ°›λŠ” λ³€μˆ˜(copy)μ—λŠ” ν• λ‹Ήλ˜λŠ” λ³€μˆ˜(score)의 μ›μ‹œκ°’μ΄ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. 이λ₯Ό 값에 μ˜ν•œ 전달(Pass by value)라 ν•œλ‹€.

값에 μ˜ν•œ 전달은 값이 λ°”λ€Œμ–΄μ„œ μ „λ‹¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ 곡간이 λ°”λ€ŒλŠ” 것이닀. κ·ΈλŸ¬λ‹ˆ sroceκ°€ 쀑간에 값이 λ°”λ€Œμ–΄λ„ scoreλ©”λͺ¨λ¦¬ 곡간에 값이 λ°”λ€ŒλŠ” 거라 copy에 직접적인 영ν–₯이 μ—†λ‹€. 즉, 두 λ³€μˆ˜μ˜ μ›μ‹œ 값은 μ„œλ‘œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ 값이 λ˜μ–΄ μ–΄λŠ ν•œμͺ½μ—μ„œ μž¬ν• λ‹Ήμ„ 톡해 λ³€κ²½ν•˜λ”λΌλ„ μ„œλ‘œ κ°„μ„­ν•  수 μ—†λ‹€.

2. 객체

2-1. λ³€κ²½ κ°€λŠ₯ν•œ κ°’

μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μ›μ‹œ 값에 μ ‘κ·Όν•œλ‹€. ν•˜μ§€λ§Œ 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μ°Έμ‘° 값을 톡해 μ‹€μ œ 객체에 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

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

let person = {
	name : "noh"
}
person.name ="youngWan"
person.gender = "male"
console.log(person) // {name: "youngWan , gender: "male"}

2-2. 참쑰에 μ˜ν•œ 전달

let person = {
	name : "Noh"
};

// μ°Έμ‘° 값을 볡사(얕은 볡사). copy와 person은 λ™μΌν•œ μ°Έμ‘° 값을 κ°–λŠ”λ‹€.
let copy = person;

// copy와 person은 λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.
console.log(copy === person); // true

// copyλ₯Ό 톡해 객체λ₯Ό λ³€κ²½ν•œλ‹€.
copy.name = "younWan"

// person을 톡해 객체λ₯Ό λ³€κ²½ν•œλ‹€.
person.address = "Seoul"

// copy와 person은 λ™μΌν•œ 객체λ₯Ό κ°€λ₯΄ν‚¨λ‹€.
// λ”°λΌμ„œ μ–΄λŠ ν•œμͺ½μ—μ„œ 객체λ₯Ό λ³€κ²½ν•˜λ©΄ μ„œλ‘œ 영ν–₯을 μ£Όκ³  λ°›λŠ”λ‹€.
console.log(person); // {name: "younWan", address:"Seoul"}

객체λ₯Ό κ°€λ₯΄ν‚€λŠ” λ³€μˆ˜(원본 person)λ₯Ό λ‹€λ₯Έ λ³€μˆ˜(사본, copy)에 ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ°Έμ‘° 값이 볡사 λ˜μ–΄ 전달 λœλ‹€ 이λ₯Ό 참쑰에 μ˜ν•œ 전달이라 ν•˜κ³  이것은 두 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό 곡유 ν•œλ‹€λŠ” 것을 μ˜λ―Έν•˜λ©° 원본(person) λ˜λŠ” 사본(copy) 쀑 μ–΄λŠ ν•œμͺ½μ—μ„œ 객체λ₯Ό λ³€κ²½ν•˜λ©΄ μ„œλ‘œ 영ν–₯을 μ£Όκ³ λ°›λŠ”λ‹€.

값에 μ˜ν•œ 전달과 참쑰에 μ˜ν•œ 전달은 μ‹λ³„μžκ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” 값을 λ³΅μ‚¬ν•΄μ„œ μ „λ‹¬ν•˜λŠ” λ©΄μ—μ„œ λ™μΌν•˜λ‹€.

❓Quiz

let person1 = {
	name: "noh"
};
let person2 = {
	name: "noh"
};
console.log(person1 === person2); //  ?
console.log(person1.name === person2.name); // 2)? 

console.log(person1 === person2)객체의 λ‚΄μš©μ€ κ°™μ§€λ§Œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬μ— μ €μž₯된 λ³„κ°œμ˜ 객체이며, μ‹€μ œ 값을 μ°Έμ‘°ν•˜λŠ” 것이 μ•„λ‹Œ κ°μ²΄λŠ” 참쑰값을 μ°Έμ‘°ν•˜κΈ° λ•Œλ¬Έμ— 객체의 λ‚΄μš©μ΄ 같은거 μ™€λŠ” λ³„κ°œμ΄λ‹€ 고둜 fasle이닀.

μ•žμ„  λ¬Έμ œμ—μ„œλŠ” 객체λ₯Ό λΉ„κ΅ν•˜λŠ” κ²ƒμœΌλ‘œ 참쑰값을 λΉ„κ΅ν•˜λŠ” κ²ƒμ΄μ§€λ§Œ console.log(person1.name === person2.name)은 κ°’μœΌλ‘œ ν‰κ°€λ μˆ˜ μžˆλŠ” ν‘œν˜„μ‹μ΄λ‹€. 비ꡐ λΆ„μ„μ˜ 값이 λͺ¨λ‘ μ›μ‹œ κ°’ noh둜 ν‰κ°€λœλ‹€. μ›μ‹œ 값은 μ‹€μ œ 값은 μ°Έμ‘°ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œ 값이 κ°™μœΌλ©΄ 같은 ν‘œν˜„μ‹μ΄λ‹€. 고둜 true이닀.

0개의 λŒ“κΈ€