Frontend/JavaScript

[ μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript) ] Call by Value, Call by reference, Call by sharing

YWTechIT 2021. 7. 8. 11:59
728x90

πŸ“ Call by Value, Call by reference, Call by sharing

CS 곡뢀λ₯Ό ν•˜λ©° Call by Value, Call by Reference에 λŒ€ν•΄μ„œ 배우고 μžˆλŠ”λ°, ν—·κ°ˆλ¦¬λŠ” 글듀이 λ§Žμ•˜λ‹€. 결둠적으둜 JSμ—μ„œλŠ” Call by reference, Call by sharing 두 μš©μ–΄λ³΄λ‹€ Call by Value μš©μ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•Œλ§žλ‹€. λ‹€μŒ μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄μž.

 

// μ›μ‹œκ°’ λ³€κ²½μ‹œλ„
function foo(argument){
    argument = 10;
    console.log(argument)    // 10
}

// μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μž‘μ„±ν•œ ν•¨μˆ˜
function foo(){
    let argument = 5;
    argument = 10;
    console.log(argument)    // 10
}

let argument = 5;
foo(argument);

console.log(argument);    // 5

 

μ›μ‹œκ°’(Primitive type: string boolean number null undefined)은 μ£Όμ†Œ λŒ€μ‹  κ°’ 자체λ₯Ό λ³΅μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜λ‘œ μ „λ‹¬ν•œ argument와 μ‹€μ œλ‘œ ν•¨μˆ˜μ—μ„œ 받은 argument의 값은 λ‹€λ₯Έ 값이 λœλ‹€. λ•Œλ¬Έμ— 첫번째 ν•¨μˆ˜ λ‚΄λΆ€μ˜ argument console.logλŠ” 10이되고, ν•¨μˆ˜ λ°–μ—μ„œμ˜ argument console.logλŠ” 5κ°€ λœλ‹€.

 

κ·Έλ ‡λ‹€λ©΄, μ›μ‹œκ°’(Primitive type)이 μ•„λ‹Œ 객체(Object)의 속성을 λ³€κ²½ν•˜λ©΄ μ–΄λ–»κ²Œ 될까?

// κ°μ²΄νƒ€μž…μ˜ 속성 λ³€κ²½
function foo(argument){
    argument.a = 5
    console.log(argument)    // { a : 5 }
}

// μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μž‘μ„±ν•œ ν•¨μˆ˜
function foo(){
    let arguments = argument
    argument.a = 10
    console.log(arguments)    // { a : 5 }
}

let argument = {a: 5} 
foo(argument)
console.log(argument)    // { a : 5 }

 

κ°μ²΄νƒ€μž…μ˜ μΈμžλŠ” μ£Όμ†Œκ°’μ„ κ°–λŠ” μƒˆλ‘œμš΄ λ³€μˆ˜κ°€ λ˜λŠ”λ°, μ΄λ•ŒλŠ” λ™μΌν•œ 객체λ₯Ό λ°”λΌλ³΄κ³ μžˆλ‹€ λ”°λΌμ„œ ν•¨μˆ˜λ‚΄λΆ€μ˜ argumentκ°€ λ°”λ€Œλ©΄ ν•¨μˆ˜ μ™ΈλΆ€μ˜ argument도 같이 바뀐닀. 즉 ν•¨μˆ˜ λ‚΄λΆ€μ˜ κ°’κ³Ό μ™ΈλΆ€μ˜ 값이 ν•¨μˆ˜ λ‚΄λΆ€μ˜ κ°’μœΌλ‘œ 바뀐닀. 그럼 λ§ˆμ§€λ§‰μœΌλ‘œ λ‹€μŒμ€ μ–΄λ–€ κ²°κ³Όκ°€ λ‚˜μ˜¬κΉŒ?

 

function foo(argument){
    argument = 5;
    console.log(argument)    // ?
}

let argument = {a: 10}
foo(argument)
console.log(argument)    // ?

 

μ½”λ“œμ˜ 흐름을 μ‚΄νŽ΄λ³΄λ©΄ μ΄λ•ŒλŠ” ν•¨μˆ˜λ‘œ λ„˜μ–΄κ°€λŠ” argumentλŠ” 객체, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ argumentλŠ” μ›μ‹œ κ°’μœΌλ‘œ λ³€κ²½ν–ˆλ‹€. μ΄λ•ŒλŠ” 속성을 μˆ˜μ •ν•œκ²ƒμ΄ μ•„λ‹Œ κ°’ 전체λ₯Ό λ°”κΎΈλŠ”κ²ƒμ΄κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜λ‚΄λΆ€λŠ” 5, ν•¨μˆ˜μ™ΈλΆ€λŠ” {a : 10}둜 λ‚˜μ˜€κ²Œλœλ‹€.

 

λ§Œμ•½, c, c++와 같이 call by referenceκ°€ μ‘΄μž¬ν•˜λŠ” 언어라면 값이 ν•¨μˆ˜ μ™ΈλΆ€μ˜ 값도 5둜 λ°”λ€Œμ—ˆμ„ 것이닀. (λŒ€μ‹  call by sharing이라고도 λΆˆλ¦¬λŠ”λ° μ΄λŠ” 정식 λͺ…칭이 μ•„λ‹ˆλΌλŠ” 말도 μžˆμ–΄ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€.)

 

μ§€κΈˆκΉŒμ§€μ˜ λ‚΄μš©μ„ ν† λŒ€λ‘œ μ •λ¦¬ν•˜λ©΄ 객체의 속성을 μˆ˜μ • ν• λ•ŒλŠ” μ°Έμ‘° κ΄€κ³„μ§€λ§Œ κ°’ 자체λ₯Ό μˆ˜μ •ν•˜λŠ” 경우 κ·Έ 관계가 깨진닀라고 결둠을 내릴 수 μžˆλ‹€. 또, ν•¨μˆ˜ λ‚΄μ—μ„œ μ›μ‹œκ°’μ„ λ³€κ²½ν•˜λŠ” 경우 값은 λ°”λ€Œμ§€ μ•Šμ§€λ§Œ, ν•¨μˆ˜ λ‚΄μ—μ„œ 객체의 속성을 λ³€κ²½ν•˜λŠ” 경우 값이 바뀐닀.


πŸ“‹ reference

  1. ZeroCho의 JS 쀑급 κ°•μ’Œ 12-1. call by value, call by reference, call by sharing
  2. MDN - μ›μ‹œ κ°’
  3. MDN - Working_with_Objects
λ°˜μ‘ν˜•