λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
JS

[JS] : Call By Value / Call By Reference

by κΆŒμŠΎν–„ 2023. 7. 27.
 

Call by value ?

μ‹λ³„μžκ°€ κ°–κ³ μžˆλŠ” μ£Όμ†Œκ°’μœΌλ‘œ 갔을 λ•Œ ν• λ‹Ήλœ 데이터가 μ‘΄μž¬ν•˜λ©΄ call by value 이닀.

κΈ°λ³Έν˜• 데이터 νƒ€μž…μ—μ„œ λ°œμƒν•œλ‹€.

 

Call by reference ?

μ‹λ³„μžκ°€ κ°–κ³ μžˆλŠ” μ£Όμ†Œκ°’μœΌλ‘œ 갔을 λ•Œ ν• λ‹Ήλœ 데이터가 μ‘΄μž¬ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ
μ‹€μ œ 데이터가 μžˆλŠ” μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•˜κ³  μžˆλ‹€λ©΄ 그건 call by reference 이닀.

μ°Έμ‘°ν˜• 데이터 νƒ€μž…μ—μ„œ λ°œμƒν•œλ‹€.

 

JS 데이터 νƒ€μž…μ˜ μ’…λ₯˜

JSμ—μ„œ 데이터 νƒ€μž…μ€ 2κ°€μ§€ μ’…λ₯˜λ‘œ λ‚˜λ‰œλ‹€κ³  ν•œλ‹€.

 

κΈ°λ³Έν˜• = λ‹¨μΌν•œ 값을 담을 수 μžˆλŠ” νƒ€μž…

1. Number

2. String

3. Boolean

4. Undefined

5. Null

6. (ES6) Symbol

...

 

μ°Έμ‘°ν˜• = μ—°κ΄€λœ 데이터λ₯Ό 담을 수 μžˆλŠ” νƒ€μž…

μ°Έμ‘°ν˜•μ—λŠ” μ΅œμƒμœ„ 객체에 Object λΌλŠ” 객체가 있고, μ°Έμ‘°ν˜•μ˜ λͺ¨λ“  μš”μ†ŒλŠ” Object의 ν•˜μœ„μš”μ†Œλ‘œ μž‘νžŒλ‹€.
ν•˜μœ„μš”μ†Œμ—λŠ” μ•„λž˜ 보기듀이 μžˆλ‹€.

1. Array

2. Function

3. Date

4. Map

5. Set

6. Promise

7. RegExp

...

 

데이터 νƒ€μž…μ„ λ‚˜λˆ„λŠ” κΈ°μ€€ (μ€‘μš”)

1. κ°’μ˜ μ €μž₯ 방식

2. λΆˆλ³€μ„± μ—¬λΆ€

 

λ°μ΄ν„°μ˜ 볡제 방식 (κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ 차이점)

κΈ°λ³Έν˜• : 데이터가 λ‹΄κ²¨μžˆλŠ” λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œκ°’μ„ λ°”λ‘œ 볡제

μ°Έμ‘°ν˜• : 데이터가 λ‹΄κ²¨μžˆλŠ” λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œκ°’μ„ λ‚˜νƒ€λ‚΄λŠ” μ£Όμ†Œκ°’μ„ 볡제

 

λΆˆλ³€μ„± μ—¬λΆ€

κΈ°λ³Έν˜• : λΆˆλ³€μ„±μ„ κ°€μ§„λ‹€. = λΆˆλ³€ν•˜λ‹€.

μ°Έμ‘°ν˜• : λΆˆλ³€μ„±μ„ κ°–μ§€ μ•ŠλŠ”λ‹€. = κ°€λ³€ν•˜λ‹€.

 

μ΄ν•΄λ˜μ§€ μ•ŠλŠ” λΆ€λΆ„

κΈ°λ³Έν˜•μ˜ λΆˆλ³€ν•˜λ‹€λΌλŠ” 뢀뢄이 이해가 λ˜μ§€ μ•ŠμŒ.

μ˜ˆμ‹œ

var a = 6;

a = 'abc';

console.log(a); // abc

var λΌλŠ” 선언문은 μž¬ν• λ‹Ή 및 μž¬μ„ μ–Έμ΄ κ°€λŠ₯ν•œ μš©μ–΄μ΄λ‹€.

varλ₯Ό ν†΅ν•΄μ„œ aλ₯Ό μ„ μ–Έν•˜κ³ , μ„ μ–Έν•œ a에 6μ΄λΌλŠ” 값을 ν• λ‹Ήν•œ 후에 λ°”λ‘œ λ‹€μŒμ€„μ—μ„œ "μž¬ν• λ‹Ή"을 ν†΅ν•΄μ„œ a에 abcλ₯Ό μž¬ν• λ‹Ή ν•˜κ²Œ λœλ‹€λ©΄,

결과적으둜 console.log 둜 좜λ ₯값은 μž¬ν• λ‹Ήλœ abcκ°€ 찍히게 λœλ‹€.

처음 ν• λ‹Ήν•œ 값인 6μ—μ„œ aκ°€ 가진값은 abc둜 λ³€ν–ˆμœΌλ‹ˆ !

"μ΄λ ‡κ²Œ 되면, κ²°κ΅­ κΈ°λ³Έν˜•μ˜ 값은 λΆˆλ³€ν•œ 것이 μ•„λ‹ˆλΌ λ³€ν•œκ²ƒμ΄ μ•„λ‹ˆλƒ" λΌλŠ” 생각이 λ“ λ‹€.

ν•˜μ§€λ§Œ, ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λΆˆλ³€μ„± μ—¬λΆ€λ₯Ό νŒλ‹¨ν• λ•ŒλŠ” "λ©”λͺ¨λ¦¬ 관점"μ—μ„œ 봐야 ν•œλ‹€κ³  ν•œλ‹€.

κ·Έλž˜μ„œ λ©”λͺ¨λ¦¬μ— 데이터가 μ •ν™•νžˆ 무엇인지 κ³΅λΆ€ν•˜κ³ μž ν•œλ‹€.

 

데이터와 λ©”λͺ¨λ¦¬ ?

1. λΉ„νŠΈ ( bit )

  • 컴퓨터가 이해할 수 μžˆλŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„ = 0 κ³Ό 1
  • λ©”λͺ¨λ¦¬λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•œ κ°€μž₯ μž‘μ€ 쑰각 = λΉ„νŠΈ
  • ν•˜λ‚˜μ˜ λΉ„νŠΈμ—λŠ” 0 λ˜λŠ” 1둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

2. λ°”μ΄νŠΈ ( byte )

  • 컴퓨터가 λΉ„νŠΈμ‘°κ° ν•˜λ‚˜ν•˜λ‚˜λ₯Ό μ°Ύμ•„κ°€λ©° 데이터λ₯Ό λΉ„κ΅ν•˜κΈ°λŠ” λΉ„νš¨μœ¨μ μ΄κΈ° λ•Œλ¬Έμ—,
    λΉ„νŠΈ 8개λ₯Ό λͺ¨μ•„μ„œ ν•˜λ‚˜μ˜ 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒˆλ‘œμš΄ λ‹¨μœ„μΈ byteλ₯Ό λ§Œλ“€μ–΄λƒˆλ‹€.

3. λ©”λͺ¨λ¦¬ ( memory )

  • λͺ¨λ“  λ°μ΄ν„°λŠ” byte λ‹¨μœ„μ˜ μ‹λ³„μžμΈ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°’μ„ ν†΅ν•΄μ„œ κ΅¬λΆ„λœλ‹€.
  • λ”°λΌμ„œ, byte λŠ” μ„œλ‘œμ„œλ‘œ ꡬ뢄이 κ°€λŠ₯ν•˜λ‹€κ³  λ³Ό 수 μžˆλ‹€.

 

데이터가 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜λŠ” 방식

1. κΈ°λ³Έν˜• 데이터

μ˜ˆμ‹œ μ½”λ“œ

var kwon; // λ³€μˆ˜λͺ… μ„ μ–Έ
kwon = abc; // 데이터 ν• λ‹Ή

< λ©”λͺ¨λ¦¬ ν‘œ >

μ‹λ³„μž = λ³€μˆ˜λͺ… μ˜μ—­
μ‹λ³„μž μ˜μ—­μ—λŠ” kwon λΌλŠ” μ‹λ³„μžμ˜ 값을 λ¨Όμ € μ„ΈνŒ…ν•œλ‹€.
λ©”λͺ¨λ¦¬ν‘œμ˜ μ™Όμͺ½λΆ€ν„° μ­‰~ νƒμƒ‰ν•΄μ„œ μ˜€λ©΄μ„œ λΉˆκ³΅κ°„μ„ μ°Ύκ³ , λΉˆκ³΅κ°„μ„ μ°Ύμ•˜λ‹€λ©΄ 거기에 데이터λ₯Ό μ €μž₯ν•œλ‹€.

μ£Όμ†Œ ... 1002 1003 1004 1005 1006 1007 1008 1009
데이터 ... 이름 :
kwon
데이터 :
@5003
             

데이터 = λ³€μˆ˜ μ˜μ—­
데이터 μ˜μ—­μ—λŠ” abc μ΄λΌλŠ” λ³€μˆ˜μ˜ 값을 μ„ΈνŒ…ν•œλ‹€.
데이터 μ˜μ—­μ—μ„œλ„ μ™Όμͺ½λΆ€ν„° μ­‰ ~ 탐색을 ν•˜λ©΄μ„œ λΉˆκ³΅κ°„μ„ μ°Ύκ³ , μ°Ύμ•˜λ‹€λ©΄ 거기에 데이터λ₯Ό μ €μž₯ν•œλ‹€.

μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... ... ... abc          

 

μœ„μ˜ λ©”λͺ¨λ¦¬ν‘œ 해석

1002번 μ΄λΌλŠ” μ£Όμ†Œκ°’μ—λŠ” kwonμ΄λΌλŠ” λ³€μˆ˜λͺ…이 λ‹΄κ²¨μžˆκ³ , λ°μ΄ν„°μ—λŠ” @5003λ²ˆμ΄λΌλŠ” μ£Όμ†Ÿκ°’μ΄ λ‹΄κ²¨μžˆμœΌλ©°, ν•΄λ‹Ή μ£Όμ†Œκ°’μ΄ κ°€μ§€λŠ” 데이터λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ 데이터 μ˜μ—­μ„ μ‚΄νŽ΄λ³΄λ©΄,

데이터 μ˜μ—­μ˜ 5003번 μ΄λΌλŠ” μ£Όμ†Œκ°’μ—λŠ” abcλΌλŠ” μš°λ¦¬κ°€ ν• λ‹Ήν•œ 데이터값이 λ‹΄κ²¨μžˆλ‹€.

 

값을 λ°”λ‘œ ν• λ‹Ήν•˜μ§€ μ•Šκ³ , μ‹λ³„μž μ˜μ—­ / 데이터 μ˜μ—­ λ‚˜λˆ„λŠ” 이유 !!

1. 자유둜운 데이터 λ³€ν™˜μ„ μœ„ν•΄μ„œ

λ‚΄κ°€ μœ„μ²˜λŸΌ kwonμ΄λΌλŠ” μ‹λ³„μžλ₯Ό μ„ μ–Έν•΄μ„œ 1002번의 μ£Όμ†Œκ°’μ— 데이터가 λ“€μ–΄κ°”κ³ ,
1003번과 1004λ²ˆλ„ λ˜‘κ°™μ΄ μƒˆλ‘œμš΄ μ‹λ³„μž 데이터가 듀어와 μžˆλŠ” μƒνƒœμ—μ„œ,

μ£Όμ†Œ ... 1002 1003 1004 1005 1006 1007 1008 1009
데이터 ... 이름 :
kwon
데이터 :
abc
....... .......          

μ΄λ ‡κ²Œ λ°”λ‘œ abcλ₯Ό ν• λ‹Ήν–ˆλ‹€κ³  쳀을 λ•Œ, 1002λ²ˆμ— ν• λ‹Ήλœ abcλΌλŠ” 데이터λ₯Ό κΈ€μžμˆ˜κ°€ 100인 λ©”λͺ¨λ¦¬κ°’이 더 큰 λ°μ΄ν„°λ‘œ λ³€κ²½ν•œλ‹€λ©΄ ?

κΈ€μžμˆ˜κ°€ 100인 λŒ€μš©λŸ‰μ˜ 데이터λ₯Ό 담을 수 μžˆμ„λ§ŒνΌ
1002번 뿐만 μ•„λ‹ˆλΌ κ·Έ μ΄μƒμ˜ μ£Όμ†Œκ°’ μžλ¦¬κΉŒμ§€ μ°¨μ§€ν•΄μ•Ό λ³€κ²½λœ 큰 데이터λ₯Ό λ‹€ 담을 수 있기 λ•Œλ¬Έμ—
1003번과 1004λ²ˆμ— μ €μž₯된 데이터듀도 μ „λΆ€ λ‹€ λ’€λ‘œ λͺ‡ μΉΈμ”© λ°€λ €μ•Ό ν•œλ‹€.

μ–Έμ œκΉŒμ§€ ?
1002λ²ˆμ— μž¬ν• λ‹Ήλœ 데이터가 λ©”λͺ¨λ¦¬μ— μΆ©λΆ„νžˆ λ‹΄κΈΈ 수 μžˆλŠ” μ£Όμ†Œκ°’κΉŒμ§€ !

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨ 적이닀.
κ·Έλž˜μ„œ μ‹λ³„μž μ˜μ—­κ³Ό 데이터 μ˜μ—­μ„ λ”°λ‘œ λ‚˜λˆ„μ–΄μ„œ 별도 곡간에 데이터λ₯Ό 확보해 두고,
μ‹λ³„μž μ˜μ—­μ˜ λ°μ΄ν„°μ—λŠ” 데이터 μ˜μ—­μ˜ μ£Όμ†Œκ°’μ„ κ°€μ Έμ˜¬ 수 있게 ν•˜λŠ” 것이닀.

2. λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ

μ•Œμ•„λ‘μ–΄μ•Ό ν•˜λŠ” λΆ€λΆ„ ν•œκ°€μ§€!

비ꡐ적 μ‹λ³„μž μ˜μ—­μ΄ μ†Œλͺ¨ν•˜λŠ” λ©”λͺ¨λ¦¬ 양은 거의 ν•­μ‹œ 데이터 μ˜μ—­μ˜ λ©”λͺ¨λ¦¬ 양보닀 적닀 κ°€ Base !

λ§Œμ•½, 1만개의 μ‹λ³„μžλ₯Ό μƒμ„±ν–ˆλŠ”λ°, κ·Έ μƒμ„±ν•œ μ‹λ³„μžμ— ν• λ‹Ήλœ λ³€μˆ˜κ°€ 같은 값이라면 ?

κ·Έ 값을 1이라고 κ°€μ •ν–ˆμ„ λ•Œ,

JSμ—μ„œλŠ” μ •μˆ˜κ°€ κ°€μ§€λŠ” λ©”λͺ¨λ¦¬ 양은 8Byte이기 λ•Œλ¬Έμ— 1만개의 값을 μ „λΆ€ μƒˆλ‘œμš΄ μ£Όμ†Œκ°’μ— 직접 ν• λ‹Ήν–ˆλ‹€λ©΄ μ°¨μ§€ν•˜λŠ” λ©”λͺ¨λ¦¬ μš©λŸ‰μ€ 8λ§Œλ°”μ΄νŠΈκ°€ λœλ‹€.

ν•˜μ§€λ§Œ, μ‹λ³„μžμ˜ μ˜μ—­μ—λŠ” 1만개의 μ‹λ³„μžλ₯Ό 각 μ£Όμ†Œκ°’μ— ν• λ‹Ήν•˜κ³ ,
1μ΄λΌλŠ” λ³€μˆ˜λ₯Ό 데이터 μ˜μ—­μ—μ„œ 1개의 μ£Όμ†Œκ°’μ— ν• λ‹Ήν•œ 후에, κ·Έ μ£Όμ†Œκ°’μ„ μ‹λ³„μžμ˜ μ˜μ—­μ— 데이터 뢀뢄에 λŒμ–΄μ™€ μ“΄λ‹€λ©΄?

데이터 μ˜μ—­μ—μ„œλŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 1μ΄λΌλŠ” 값을 ν•˜λ‚˜μ˜ μ£Όμ†Œκ°’μ— ν• λ‹Ήν•˜λŠ”λ° 쓰인 8λ°”μ΄νŠΈκ°€ 전뢀이고,
μ‹λ³„μž μ˜μ—­μ—μ„œλŠ” 1만개의 μ‹λ³„μžλ₯Ό ν• λ‹Ήν–ˆμ§€λ§Œ, 데이터 μ˜μ—­λ³΄λ‹€λŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 적기 λ•Œλ¬Έμ— 예둜 1κ°œλ‹Ή 2λ°”μ΄νŠΈλ‘œ 작으면,

직접할당 : 8만 λ°”μ΄νŠΈ = μ‹λ³„μžμ™€ 데이터 λ”°λ‘œ 각 μ˜μ—­μ— ν• λ‹Ή : 2만 8λ°”μ΄νŠΈ 이기 λ•Œλ¬Έμ—,
λ©”λͺ¨λ¦¬ μ‚¬μš©λ©΄μ—μ„œ 효율적으둜 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

μœ„μ™€ 같은 2κ°€μ§€ 이유둜 ν• λ‹Ήλœ 데이터λ₯Ό μ‹λ³„μž μ˜μ—­μ— 직접 ν• λ‹Ήν•˜μ§€ μ•Šκ³ ,
데이터 μ˜μ—­μ— μ €μž₯ν•œ λ’€ ν•΄λ‹Ή μ£Όμ†Œκ°’μ„ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 것이닀.

 

μœ„μ˜ μ΄ν•΄λ˜μ§€ μ•ŠλŠ” λΆ€λΆ„ ν•΄κ²°

μœ„μ—μ„œ 이해가 λ˜μ§€ μ•Šμ•˜λ˜ λΆˆλ³€μ„±μ„ ν™•μΈν•˜λŠ” κ³Όμ •μ˜ μ˜ˆμ‹œ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ™”λ‹€.

1. var a = 6;

2. a = 'abc';

3. console.log(a); // abc

< 1번 쀄 μ½”λ“œ λ©”λͺ¨λ¦¬ν‘œ >

μ£Όμ†Œ ... 1002 1003 1004 1005 1006 1007 1008 1009
데이터 ... 이름 : a
데이터 :
@5001
             
μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 6              

< 2번 쀄 μ½”λ“œ λ©”λͺ¨λ¦¬ν‘œ >

μ£Όμ†Œ ... 1002 1003 1004 1005 1006 1007 1008 1009
데이터 ... 이름 : a
데이터 :
@5002
             
μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 6 abc            

λΆˆλ³€μ„±μ„ νŒλ‹¨ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ©”λͺ¨λ¦¬ κ΄€μ μ—μ„œ 봐야 ν•œλ‹€ ν–ˆμ—ˆκ³ , λΆˆλ³€ν•¨κ³Ό λΆˆλ³€ν•˜μ§€ μ•ŠμŒμ„ λ©”λͺ¨λ¦¬κ΄€μ μ—μ„œ μ •μ˜ν•˜λŠ” λ°”λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

λΆˆλ³€ν•˜λ‹€ = 데이터 μ˜μ—­ λ©”λͺ¨λ¦¬λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€.
λΆˆλ³€ν•˜μ§€ μ•Šλ‹€ = 데이터 μ˜μ—­ λ©”λͺ¨λ¦¬λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

λ”°λΌμ„œ, 데이터 μ˜μ—­μ˜ 5001λ²ˆμ— ν• λ‹Ήλœ 6의 값이 abc둜 λ³€κ²½ν•œκ²ƒμ΄ μ•„λ‹Œ, μƒˆλ‘œμš΄ μ£Όμ†Œκ°’μ— abcλ₯Ό ν• λ‹Ήμ‹œμΌ°κ³ , μ‹λ³„μž μ˜μ—­μ—μ„œλŠ” κ·Έ μ£Όμ†Œκ°’μ„ κ°€μ Έμ˜¨ 것 이기 λ•Œλ¬Έμ—, 6이 κ°€μ§„ λ©”λͺ¨λ¦¬λŠ” λ³€κ²½λ˜μ§€ μ•Šμ€ 것이닀.

 

κΉ¨μ•Œ μŠ΅λ“ 지식

이제 μž¬ν• λ‹ΉμœΌλ‘œ 더 이상 μ‚¬μš©μ΄ λ˜μ§€ μ•Šμ€ 5001번의 μ£Όμ†Œκ°’μ΄ κ°€μ§€λŠ” 6μ΄λΌλŠ” λ°μ΄ν„°λŠ” JSμ•ˆμ— κ°€λΉ„μ§€μ»¬λ ‰ν„°λΌλŠ” μΉœκ΅¬κ°€ μžˆλŠ”λ°,
이런 μ“Έλͺ¨κ°€ μ—†μ–΄μ§„ μ½”λ“œλ“€μ„ 가비지컬렉터 μΉœκ΅¬λ“€μ΄ 수거λ₯Ό ν•˜κ³  λ‹€λ‹Œλ‹€κ³  ν•©λ‹ˆλ‹€.

κ·Έλ ‡κ²Œ JS λ‚΄μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό 관리해 λ‚˜κ°„λ‹€κ³  ν•©λ‹ˆλ‹€.

 

데이터가 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜λŠ” 방식

2. μ°Έμ‘°ν˜• 데이터

μ˜ˆμ‹œ μ½”λ“œ

var obj1 = {
    a: 1,
    b: 'gd',
};

< λ©”λͺ¨λ¦¬ ν‘œ >

μ‹λ³„μž = λ³€μˆ˜λͺ… μ˜μ—­
κΈ°λ³Έν˜• 데이터와 λ™μΌν•˜κ²Œ 이루어 μ§„λ‹€.

μ£Όμ†Œ ... 1001 1002 1003 1004 1005 1006 1007 1008
데이터 ... 이름 : 
obj1
데이터 : 
@7101 ~ 
@7102
             

데이터 = λ³€μˆ˜ μ˜μ—­
κΈ°λ³Έν˜• 데이터와 λ™μΌν•˜κ²Œ 이루어진닀.
λ‹€λ§Œ μ°Έκ³ ν•  뢀뢄은 μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ 객체 킀값은 λ‹€λ₯Έ 별도 곡간에 μ €μž₯되고,
λͺ¨λ“  λ°μ΄ν„°λŠ” 이 κ³³ !! 데이터 μ˜μ—­μ— μ €μž₯λœλ‹€λŠ” 것을 κΈ°μ–΅ν•˜μž !!

μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 1 "gd"            

(μ€‘μš”) 데이터 μ˜μ—­ λ‚΄μ˜ 객체 별도 곡간
μ°Έμ‘°ν˜• 데이터가 μ €μž₯될 μ‹œμ—λŠ” μ΄λ ‡κ²Œ μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ 킀값듀이 λ³„λ„λ‘œ μ €μž₯될 수 μžˆλŠ” 곡간에 μ €μž₯ν•˜κ²Œ λœλ‹€.
빈 μ£Όμ†Œκ°’μ— 객체의 key값이 λ“€μ–΄κ°€κ³ , ν•΄λ‹Ή key 값이 κ°€μ§€λŠ” value값을 λ‚˜νƒ€λ‚΄λŠ” μ£Όμ†Œκ°’μ΄ 같이 λ“€μ–΄κ°„λ‹€.

μ£Όμ†Œ ... 7001 7002 7003 7004 7005 7006 7007 7008
데이터 ... 이름 : a
데이터 : 
@5001
이름 : b
데이터 :
@5002
           

 

μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ κ°€λ³€μ„±

가변성을 ν™•μΈν•˜κΈ° μœ„ν•œ μ˜ˆμ‹œ μ½”λ“œ

var obj1 = {
    a: 1,
    b: 'gd',
};

obj1.a = 23;

console.log(obj1); // 좜λ ₯ κ°’ : { a: 23, b: 'gd' }

μœ„ μ½”λ“œλ₯Ό 기반으둜 λ©”λͺ¨λ¦¬ ν‘œλ₯Ό ν™•μΈν•΄λ³΄μ•˜μ„ λ•Œ,

< λ©”λͺ¨λ¦¬ ν‘œ >

μ‹λ³„μž μ˜μ—­μ€ λ³€κ²½λ˜λŠ” 뢀뢄이 μ—†μŠ΅λ‹ˆλ‹€.

μ£Όμ†Œ ... 1001 1002 1003 1004 1005 1006 1007 1008
데이터 ... 이름 : 
obj1
데이터 : 
@7101 ~ 
@7102
             

이 μ•„λž˜λ‘œλŠ” μ „λΆ€ 데이터 μ˜μ—­μΈλ°, μ—¬κΈ°μ„œ μ°Έμ‘°ν˜•μ˜ 가변성이 λ“œλŸ¬λ‚©λ‹ˆλ‹€.
1. 데이터 μ˜μ—­μ— μž¬ν• λ‹Ήν•œ 23μ΄λΌλŠ” 값이 빈 λ©”λͺ¨λ¦¬μ— 할당이 λ˜μ–΄μ•Ό ν•˜κ΅¬μš”. // 빈 λ©”λͺ¨λ¦¬μΈ 5003λ²ˆμ— ν• λ‹Ή
2. 데이터 μ˜μ—­λ‚΄μ˜ 객체 별도 κ³΅κ°„μ•ˆμ— 7001의 μ£Όμ†Œκ°’μ΄ κ°€μ Έμ˜€λŠ” 데이터 μ£Όμ†Œκ°€ λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
μ™œλƒλ©΄ ? a의 값이 1이 μ•„λ‹Œ 23으둜 재 ν• λ‹Ή ν–ˆκΈ° λ•Œλ¬Έμ—, aλΌλŠ” 이름을 κ°–κ³ μžˆλŠ” 7001 μ£Όμ†Œμ•ˆμ˜ 데이터 μ£Όμ†ŒλŠ” 1인값인 5001을 κ°€μ Έμ˜€λŠ”κ²Œ μ•„λ‹ˆλΌ μƒˆλ‘œ 할당받은 23이 ν• λ‹Ήλœ μ£Όμ†Œκ°’μ„ 가져와야 ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

데이터 μ˜μ—­μ˜ λ³€κ²½λœ κ²°κ³ΌλŠ” λ‹€μŒ ν‘œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 1 "gd" 23          
μ£Όμ†Œ ... 7001 7002 7003 7004 7005 7006 7007 7008
데이터 ... 이름 : a
데이터 : 
@5003
이름 : b
데이터 :
@5002
           

λ”°λΌμ„œ, 데이터 μ˜μ—­μ˜ λ©”λͺ¨λ¦¬κ°€ λ³€κ²½λ˜λƒ μ•ˆλ˜λƒλ‘œ λΆˆλ³€μ„±μ„ λ‚˜λˆ„κΈ° λ•Œλ¬Έμ—, 데이터 μ˜μ—­μ˜ λ©”λͺ¨λ¦¬κ°€ λ³€κ²½λ˜μ—ˆμœΌλ―€λ‘œ,
μ°Έμ‘°ν˜• λ°μ΄ν„°λŠ” λΆˆλ³€ν•˜μ§€ μ•Šλ‹€ === κ°€λ³€ν•˜λ‹€.

 

μ€‘μ²©κ°μ²΄μ˜ 데이터가 ν• λ‹Ήλ˜λŠ” κ³Όμ •

그럼 μ΄λ²ˆμ—” κ°μ²΄μ•ˆμ˜ 객체가 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜λŠ” 과정은 μ–΄λ–»κ²Œ λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.
μœ„μ˜ μ„€λͺ…을 기반으둜 혼자 ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•΄λ³΄μ•˜λŠ”λ°, ν‹€λ Έλ‹€. ^^

μ€‘μ²©κ°μ²΄μ˜ 데이터 할당과정은 λ‹€μŒκ³Ό κ°™λ‹€.

쀑첩객체 μ˜ˆμ‹œ μ½”λ“œ

var obj1 = {
    a: 3,
    arr: [1, 2, 3],
};

< λ©”λͺ¨λ¦¬ ν‘œ >

ν‘œ ꡬ성은 λ‹€μŒκ³Ό κ°™λ‹€.
ν•­μ‹œ ν‘œλŠ” μ‹λ³„μž μ˜μ—­ / 데이터 μ˜μ—­ 으둜 κ΅¬μ„±λ˜μ–΄ 있으며, 데이터 μ˜μ—­μ•ˆμ—λŠ” μ°Έμ‘°ν˜• 데이터일 경우 각 객체가 λ‚˜νƒ€λ‚΄λŠ” 별도 곡간이 λ”°λ‘œ μžˆλ‹€κ³  μƒκ°ν•˜μž !!

μ‹λ³„μž μ˜μ—­

μ£Όμ†Œ ... 1001 1002 1003 1004 1005 1006 1007 1008
데이터 ... 이름 : obj1
데이터 :
@7001 ~
@7002
             

데이터 μ˜μ—­

μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 3 4 5          

obj1의 별도 곡간

μ£Όμ†Œ ... 7001 7002 7003 7004 7005 7006 7007 7008
데이터 ... 이름 : a
데이터 :
@5001
이름 : arr
데이터 : 
@8001 ~
@8003
           

arr의 별도곡간
객체의 경우 key값에 따라 데이터λ₯Ό κ΄€λ¦¬ν–ˆλ‹€λ©΄, λ°°μ—΄μ˜ κ²½μš°μ—λŠ” 인덱슀 κ°’μœΌλ‘œ κ΄€λ¦¬λœλ‹€.

μ£Όμ†Œ ... 8001 8002 8003 8004 8005 8006 8007 8008
데이터 ... i = 0
데이터 : 
@5001
i = 1
데이터 : 
@5002
i = 2
데이터 : 
@5003
         

 

λ³΅μ‚¬ν•œ λ³€μˆ˜ λ©”λͺ¨λ¦¬ ν• λ‹Ή κ³Όμ •

μ˜ˆμ‹œ μ½”λ“œ

var a = 10;
var obj = { b: 3, c: 'hi' };

// λ‹€λ₯Έ λ³€μˆ˜λ‘œ 볡사
var d = a;
var obj1 = obj;

< λ©”λͺ¨λ¦¬ ν‘œ >
편의λ₯Ό μœ„ν•΄ 이제 μ‹λ³„μž μ˜μ—­κ³Ό 별도곡간에 이름 μƒλž΅ν•¨.

μ‹λ³„μž μ˜μ—­

μ£Όμ†Œ ... 1001 1002 1003 1004 1005 1006 1007 1008
데이터 ... a /
@5001
obj /
@7001 ~
@7002
d /
@5001
obj1 /
@7001 ~
@7002
       

데이터 μ˜μ—­

μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 10 3 "hi"          

obj 별도 곡간

μ£Όμ†Œ ... 7001 7002 7003 7004 7005 7006 7007 7008
데이터 ... b /
@5002
c /
@5003
           

 

λ³΅μ‚¬ν•œ λ³€μˆ˜ 값을 λ³€κ²½ν•  λ•Œ !!

μœ„μ™€ λ™μΌν•œ μ½”λ“œμ—μ„œ λ³΅μ‚¬ν•œ κ°’λ§Œ λ³€κ²½ν•  것이닀.

μ˜ˆμ‹œ μ½”λ“œ

var a = 10;
var obj = { b: 3, c: 'hi' };

// λ³€μˆ˜ 볡사
var d = a;
var obj1 = obj;

// λ³΅μ‚¬ν•œ κ°’ λ³€κ²½
d = 13;
obj1.b = 9;

< λ©”λͺ¨λ¦¬ ν‘œ >

μ‹λ³„μž μ˜μ—­

μ£Όμ†Œ ... 1001 1002 1003 1004 1005 1006 1007 1008
데이터 ... a /
@5001
obj /
@7001 ~
@7002
d /
@5004
obj1 /
@7001 ~
@7002
       

데이터 μ˜μ—­

μ£Όμ†Œ ... 5001 5002 5003 5004 5005 5006 5007 5008
데이터 ... 10 3 "hi" 13 9      

obj 별도 곡간

μ£Όμ†Œ ... 7001 7002 7003 7004 7005 7006 7007 7008
데이터 ... b /
@5005
c /
@5003
           

 

μ€‘μš”β­οΈ

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점이 ν•˜λ‚˜ μžˆλ‹€.

// 첫 μ„ μ–Έ λ‹Ήμ‹œ
var a = 10;
var obj = { b: 3, c: 'hi' };

// λ³€μˆ˜ 볡사
var d = a;
var obj1 = obj;

// λ³΅μ‚¬ν•œ λ³€μˆ˜μ— κ°’ μž¬ν• λ‹Ή
d = 13;
obj1.b = 9;

// 좜λ ₯ κ°’ : 
console.log(a, d); // 10 , 13
console.log(obj, obj1); // { b: 9, c: 'hi' } { b: 9, c: 'hi' }

< κΈ°λ³Έν˜• >

10μ΄λΌλŠ” 데이터가 ν• λ‹Ήλœ aλΌλŠ” μ‹λ³„μžλ₯Ό 가져와 d에 λ³΅μ‚¬ν–ˆκ³ , λ³΅μ‚¬ν•œ d의 값을 μž¬ν• λ‹Ήμ„ 톡해 13으둜 λ³€κ²½ν•΄μ£Όμ—ˆλ‹€.
λ”°λΌμ„œ μš°λ¦¬κ°€ μ›ν–ˆλ˜ 값인 a = 10 / d = 13이 μ •μƒμ μœΌλ‘œ 좜λ ₯λ˜μ—ˆλ‹€.

⭐️ < μ°Έμ‘°ν˜• > ⭐️

b : 3 / c : "hi" pair λ₯Ό μ΄λ£¨λŠ” obj λ₯Ό 가져와 obj1둜 λ³΅μ‚¬ν–ˆκ³ , λ³΅μ‚¬ν•œ obj1의 b의 μš”μ†Œκ°’λ§Œ 9λΌλŠ” 데이터λ₯Ό μž¬ν• λ‹Ή ν•΄μ£Όμ—ˆλ‹€.
λ”°λΌμ„œ μš°λ¦¬κ°€ μ›ν•œκ°’μ€ obj = { b : 3 , c : "hi" } / obj1 = { b : 9 , c : "hi" } 이것이닀.

ν•˜μ§€λ§Œ, 좜λ ₯값을 확인해보면 obj = { b: 9, c: 'hi' } / obj1 = { b: 9, c: 'hi' } 둜 obj1의 b μš”μ†Œλ§Œ λ³€κ²½ν–ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  obj의 bμš”μ†ŒκΉŒμ§€ λ³€κ²½λœ 것을 확인할 수 μžˆλ‹€.

μ΄λŠ” μœ„μ˜ λ©”λͺ¨λ¦¬ν‘œλ₯Ό 확인해보면 obj 와 obj1이 μ„œλ‘œ 같은 λ°μ΄ν„°μ˜ μ£Όμ†Œκ°’μ„ 바라보고 μžˆλ‹€λŠ” κ±Έ μ•Œ 수 있고, obj 1의 b 의 μš”μ†Œκ°’μ„ λ³€κ²½ν•˜λ©΄μ„œ obj λ³„λ„κ³΅κ°„μ˜ d의 데이터 μ£Όμ†Œκ°’μ΄ λ³€κ²½λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이런 μ›ν•˜μ§€ μ•Šμ€ 였λ₯˜κ°’을 λ§Œλ‚˜κ²Œ 된 것이닀.

 

μœ„ μ°Έμ‘°ν˜•μ˜ 였λ₯˜ ν•΄κ²° 방법

였λ₯˜ ν•΄κ²° μ½”λ“œ

var a = 10;
var obj = { b: 3, c: 'hi' };

var d = a;
var obj1 = { b: 12, c: 'hello' }; // λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•œ 것이 μ•„λ‹Œ, μƒˆλ‘œμš΄ 객체λ₯Ό ν• λ‹Ήν•΄μ£Όμ—ˆλ‹€.

d = 13;
obj1.b = 9;

console.log(a, d); // 10, 13
console.log(obj, obj1); // { b: 3, c: 'hi' } { b: 9, c: 'hello' }

 

μœ„ ν•΄κ²°λ°©λ²•μ˜ 좜λ ₯ 값이 μš°λ¦¬κ°€ μ›ν•˜λŠ” κ°’μœΌλ‘œ λ‚˜μ˜€λŠ” 이유

4번 μ€„μ—μ„œ λ³€μˆ˜ 볡사λ₯Ό μ§„ν–‰ν•  λ•Œ κΈ°μ‘΄ objλΌλŠ” λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•œ 것이 μ•„λ‹Œ μƒˆλ‘œμš΄ 객체λ₯Ό ν• λ‹Ήν–ˆλ‹€.

κ·Έλ ‡κ²Œ λ˜λ©΄μ„œ obj1도 μƒˆλ‘œμš΄ obj1만의 별도곡간이 데이터 μ˜μ—­λ‚΄μ— κ°€μ§€κ²Œ λ˜μ—ˆκ³ , κ·Έ μ•ˆμ—μ„œ 데이터 μ£Όμ†Œλ₯Ό κ°€μ Έμ˜€λ©΄μ„œ, ν•΄λ‹Ή 데이터 μ£Όμ†Œλ₯Ό κ°–κ³  μžˆλŠ” obj1의 μ˜μ—­μ˜ μ£Όμ†Œκ°’μ„ obj1μ΄λΌλŠ” μ‹λ³„μžκ°€ κ°€μ§€κ²Œ λ˜μ—ˆμœΌλ‹ˆ, μœ„μ˜ 였λ₯˜κ°€ 해결이 된 것이닀.

 

λŠλ‚€ 점

call by value 와 call by reference 에 λŒ€ν•΄μ„œ μ•Œκ³  μ‹Άμ–΄μ„œ 데이터 νƒ€μž…λΆ€ν„° κΈ°λ³Έν˜• μ°Έμ‘°ν˜•, λ‚˜λˆ„λŠ” κΈ°μ€€, 그리고 λ©”λͺ¨λ¦¬μ— 데이터가 ν• λ‹Ήλ˜λŠ” 방식과 볡사 ν›„ 값을 λ³€κ²½ν–ˆμ„ λ•Œ μΌμ–΄λ‚˜λŠ” μΌλ“€κΉŒμ§€ κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ 차이에 λŒ€ν•΄μ„œ ν•˜λ£¨μ’…μΌ 이 포슀트λ₯Ό μ •λ¦¬ν–ˆλ‹€.

μ—¬λŸ¬κ°€μ§€ μ‹œμ²­ν•˜κ³  μ°Ύμ•„λ³΄λ©΄μ„œ 'μ•„ κ·Έλž˜λ„ 이제 데이터가 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” 방식과 κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ μ°¨μ΄λŠ” ν™•μ‹€ν•˜κ²Œ 깨우치고 λ‹€μŒ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°€λŠ” 것 κ°™μ•„μ„œ λ„ˆλ¬΄λ„ˆλ¬΄λ„ˆλ¬΄ ν–‰λ³΅ν•˜λ‹€'

이런 였λ₯˜κ°€ μƒκΈ΄λ‹€λŠ”κ²ƒμ΄ μ°Έ μ‹ κΈ°ν•˜λ‹€. 이 뢀뢄에 λŒ€ν•΄μ„œ μ•žμœΌλ‘œ κ²ͺ을 μ΄μŠˆκ°€ 무엇듀이 μžˆλŠ”μ§€λ„ 찬찬히 μ‚΄νŽ΄λ΄μ•Όκ² λ‹€.

 

#데이터_νƒ€μž… #κΈ°λ³Έν˜• #μ°Έμ‘°ν˜• #call_by_value #call_by_reference #볡사 #이슈 #데이터 #λ©”λͺ¨λ¦¬

'JS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JS] : this binding  (0) 2023.07.28
[JS] : 얕은 볡사 / κΉŠμ€ 볡사  (0) 2023.07.27
[JS] : 쑰건뢀 μ‹€ν–‰ / μ‚Όν•­ μ—°μ‚°μžμ™€ 단좕평가  (0) 2023.07.26
[JS] : Switch  (0) 2023.07.26
[JS] : Null / Undefined  (0) 2023.07.24