값에 의한 전달과 참조에 의한 전달
변수에 변수를 할당했을 때 무엇이 어떻게 전달되는지에 따라 값에 의한 전달과 참조에 의한 전달이 구분된다.
값에 의한 전달 (pass by value)
값에 의한 전달은, 숫자, 문자, Boolean 등 원시값이 담긴 객체에서 이뤄진다.
- 전달하는 변수에 저장된 “값”을 다른 메모리 공간에 복사하여 전달받는 변수에 전달한다.
- 원본과 사본 어느 한 쪽을 변경해도 다른 쪽이 영향을 받지 않는다. 즉 둘은 별개의 값이 되며, 서로 간섭할 수 없다.
참조에 의한 전달 (pass by reference)
참조에 의한 전달은, 객체와 배열 등 객체 타입의 값을 할당할 때 이뤄진다.
- 전달하는 변수에 저장된 “참조값(할당된 객체가 담긴 메모리 주소)”을 다른 공간에 복사하여 전달받는 변수에 전달한다.
- 변수들이 메모리 주소를 통해 같은 객체에 접근할 수 있다. 즉, 두 개의 식별자가 하나의 객체를 “공유” 한다.
- 원본과 사본 어느 한 쪽에서 객체를 변경하면 서로 영향을 주고받는다.
🚨주의점
- 자바스크립트에서의 참조에 의한 전달은 메모리 공간에 저장된 값을 복사해 전달한다는 점에서 값에 의한 전달과 동일하다. 변수에 저장된 값이 원시값이냐, 참조값이냐의 차이가 존재한다.
- 따라서 자바스크립트에서의 참조에 의한 전달은 “공유에 의한 전달(pass by share)”이라고 표현하기도 한다. (공식 용어 x)
...에 의한 호출 vs ...에 의한 전달
“… 에 의한 호출(call by …)”은, 함수를 호출하면서 매개변수(parameter)에 값을 전달하는 방식을 말한다.
동작 방식은 “… 에 의한 전달(pass by …)” 과 동일하니, 값을 전달하는 것이 함수의 매개변수냐/아니냐를 두고 구분하면 된다!