πŸ™Œ 값에 μ˜ν•œ 전달(Pass by Value)와 참쑰에 μ˜ν•œ 전달(Pass by Reference)

@leedawn Β· March 21, 2024 Β· 4 min read

μ•Œκ³ λ¦¬μ¦˜μ„ ν’€λ©΄μ„œ μ•„λž˜μ™€ 같은 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ—¬, 값을 λ³€κ²½ν•˜κ³  두 수의 μœ„μΉ˜λ₯Ό λ°”κΎΈλ €κ³  ν–ˆλ‹€.

function changeNum(n1, n2) {
  if (n1 < n2) {
    n1 = n2 + 1
  } else {
    n2 = n1 + 1
  }
}

const arr = [2, 3, 9]
let [a, b, c] = arr

changeNum(a, b)

console.log(arr) // [2, 3, 9]

ν•˜μ§€λ§Œ μ˜λ„μ™€λŠ” λ‹€λ₯΄κ²Œ changeNum은 μœ„μΉ˜λ₯Ό 바꾸지 λͺ»ν•˜κ³  arrλŠ” 원본 κ·ΈλŒ€λ‘œλ₯Ό 좜λ ₯ν•œλ‹€.

μ™œ ν•¨μˆ˜ n1, n2의 값을 λ³€κ²½ν•˜μ§€ λͺ»ν•˜λŠ” 걸까? πŸ₯²

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λ³Έ νƒ€μž…(primitive types)은 값에 μ˜ν•œ 전달(Pass by Value) λ°©μ‹μœΌλ‘œ ν•¨μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ΄λŠ” ν•¨μˆ˜μ— 값을 전달할 λ•Œ, μ‹€μ œ κ°’μ˜ 볡사본이 μ „λ‹¬λ˜λ©°, ν•¨μˆ˜ λ‚΄μ—μ„œ λ§€κ°œλ³€μˆ˜μ˜ 값을 변경해도 μ™ΈλΆ€μ˜ λ³€μˆ˜μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

λ”°λΌμ„œ changeNum ν•¨μˆ˜ λ‚΄μ—μ„œ n1, n2의 값을 변경해도 a, b μ›λ³Έμ—λŠ” 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

그럼 μ–΄λ–»κ²Œ λ°”κΏ€ 수 μžˆμ„κΉŒ?

참쑰에 μ˜ν•œ 전달(Pass by Reference)

κ°μ²΄λ‚˜ λ°°μ—΄κ³Ό 같은 μ°Έμ‘° νƒ€μž…μ€ 참쑰에 μ˜ν•œ 전달(Pass by Reference) λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€. 이 λ°©μ‹μ—μ„œλŠ” λ³€μˆ˜κ°€ μ‹€μ œ 데이터가 μ•„λ‹Œ, 데이터가 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•œλ‹€.

ν•¨μˆ˜μ— μ°Έμ‘° νƒ€μž…μ˜ 값을 인자둜 전달할 λ•Œ, 전달 λ˜λŠ” 것은 μ‹€μ œ λ°μ΄ν„°μ˜ 볡사본이 μ•„λ‹ˆλΌ 데이터가 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œμ˜ 참쑰이닀. λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄μ—μ„œ μ°Έμ‘°λ₯Ό 톡해 데이터λ₯Ό λ³€κ²½ν•˜λ©΄ 원본 데이터에도 반영이 λœλ‹€.

μ΄λŸ¬ν•œ 방식을 μ΄μš©ν•˜μ—¬ n1κ³Ό n2 값을 λ³€κ²½ν•˜λ©΄ κ°μ²΄λ‚˜ 배열을 톡해 값을 μ „λ‹¬ν•˜κ³ , ν•¨μˆ˜ λ‚΄μ—μ„œ 객체의 μ†μ„±μ΄λ‚˜ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

function changeNum(arr) {
  if (arr[0] < arr[1]) {
    arr[0] = arr[1] + 1
  } else {
    arr[1] = arr[0] + 1
  }
}

const arr = [2, 3, 9]
changeNum(arr)

console.log(arr) // [4, 3, 9]

값에 μ˜ν•œ 전달(Pass by Value)

μ•„κΉŒ λ§ν–ˆλ“―μ΄ κΈ°λ³Έ νƒ€μž…(primitive type)인 숫자, λ¬Έμžμ—΄, boolean, null, undefined, Symbol, BigInt은 값에 μ˜ν•œ 전달(Pass by Value)λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•œλ‹€. μ΄λŠ” ν•¨μˆ˜μ— κΈ°λ³Έ νƒ€μž…μ˜ 값을 인자둜 전달할 λ•Œ, μ‹€μ œ 값이 μ•„λ‹Œ κ·Έ κ°’μ˜ 볡사본이 ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λœλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

λ”°λΌμ„œ, ν•¨μˆ˜ λ‚΄μ—μ„œ λ§€κ°œλ³€μˆ˜μ˜ 값을 변경해도 원본 λ³€μˆ˜μ˜ κ°’μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.

μ•„λž˜λŠ” 값에 μ˜ν•œ 전달에 λŒ€ν•œ κ°„λ‹¨ν•œ μ˜ˆμ‹œ μ½”λ“œλ‹€.

function modifyValue(x) {
  x = 5
  console.log("ν•¨μˆ˜ λ‚΄λΆ€: ", x) // ν•¨μˆ˜ λ‚΄λΆ€: 5
}

let a = 3

modifyValue(a)
console.log("ν•¨μˆ˜ μ™ΈλΆ€: ", a) // ν•¨μˆ˜ μ™ΈλΆ€: 3

μš”μ•½

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λ³Έ νƒ€μž…(primitive type)은 값에 μ˜ν•œ 전달(Pass by Value) λ°©μ‹μœΌλ‘œ μ²˜λ¦¬λœλ‹€. 즉, ν•¨μˆ˜ λ‚΄μ—μ„œ λ§€κ°œλ³€μˆ˜μ˜ 값을 변경해도 원본 λ³€μˆ˜μ˜ κ°’μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.
  • 반면 κ°μ²΄λ‚˜ λ°°μ—΄ 같은 μ°Έμ‘° νƒ€μž…(reference type)은 참쑰에 μ˜ν•œ 전달(Pass by Reference) λ°©μ‹μœΌλ‘œ μ²˜λ¦¬λœλ‹€.
@leedawn
μ•ˆλ…•ν•˜μ„Έμš”. μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 μ΄μ§€ν˜œμž…λ‹ˆλ‹€.