call by value / call by reference

송승찬·2020년 9월 24일
0

TIL

목록 보기
32/52

call by...?

  • 인자를 전달하는 방식에 따른 함수 호출 방법을 의미
    크게 Call By Value와 Call By Reference로 나뉜다.

그럼 자바스크립트는?

자바스크립트는 Call By Value로 함수를 호출
대신, 호출 방식에 따라서 인자가 평가되는 과정이 달라진다.
즉, 함수의 매개변수가 원시타입(Primitive Type)인 경우에는 전달받은 인자값을 복사하고, 참조타입(Reference Type)인 경우 메모리 주소값을 복사한다.

호출방식

1. 매개변수가 원시타입일때(Boolean,String,Number,Undefined,Null)

  • 함수 실행시 전달받은 인자를 복사한다.
    즉,사본을 만드는 것과 동일하고 좀 더 정확하게는 다른 메모리 위치에 저장되고
    전달한 인자와 전달받은 인자는 서로 다른 주소값을 가진다
    따라서 함수 내부에서 변수에 대한 모든 변경 사항이 함수 외부에서 발생하는 변수와 완전히 분리되고, 함수 내부에서 변수 값을 변경해도 원래 외부 변수 값은 바뀌지 않는다.
function change(pri) {
  pri = 'Lite'
}
const seoul = 1
change(seoul)
console.log(seoul) // seoul; = 1

2. 매개변수가 참조타입일때(Array,Object)

  • 함수의 인수에 객체 전달 시, 인수로 전달되는 건 객체의 key/value쌍이 아니라 객체 또는 배열에 대한 참조(메모리 주소)이기에 함수 내부에서 객체를 바꾸면 당연히 같은 곳을 가리키고 있던, 인자로 들어온 객체도 같이 바뀐다.
  function changeReference(obj) {
    obj.seoul = 'Lite'
  }
  const o2 = { seoul: 1 }
  changeReference(o2)
  console.log(o2) // {seoul: 'Lite'}

그렇다면 이 코드의 결과는?

 function changeReference(obj) {
    obj =  {seoul:'Lite'}
  }
  const o2 = { seoul: 1 }
  changeReference(o2)
  console.log(o2) 

{seoul: '1'}이다.

why?

obj ={}를 주목해야 한다.
즉, 새로운 객체를 할당함으로써 obj가 새로운 메모리 주소를 가리키고 있기에 함수의 인자로 넘어온 o2 객체에 어떤 영향도 주지X
따라서 여전히 {seoul:1}의 값을 유지

  • 결론, call by value,reference라는 용어보다 어떤 값이 인자로 들어오는 지를 잘 봐야할 것 같다.
    오류는 언제나 지적해주시면 감사하겠습니다.
profile
superfly

0개의 댓글