[JS] Call by Value, Call by Reference

중중·2023년 4월 19일

JS 개념 공부

목록 보기
3/4

🚨제가 이해해서 정리한 것은 틀릴 수 있단 걸 알기에 잘못된 부분 제보나 덧붙일 설명, 의견 공유는 언제나 환영합니다!

Call by Value, Call by Reference 란?

함수 호출에서 인자를 어떻게 전달 하고 매개 변수로 받는지에 대한 방식

  • Call by Value

    Call by Value 는 값에 의한 전달로 값을 복사한다.

    • 장점

      전달될 때 값을 복사하여 처리하기 때문에 원래 값에 영향을 주지 않는다.
    • 단점

      전달되는 값이 클 경우 값 자체를 복사하면서 메모리 공간을 사용하기 때문에 메모리 사용량이 늘어난다.
  • Call by Reference

    Call by Reference 는 참조에 의한 전달로 주소 값을 전달한다.

    • 장점

      전달되는 값이 커도 값 자체를 복사하지 않고 주소 값을 직접 참조하기 때문에 처리 속도가 빠르며 메모리 효율이 좋다.
    • 단점

      주소 값을 직접 참조하기 때문에 같은 주소를 참조하는 다른 변수에 영향을 준다.

❗결론부터 말하자면 자바스크립트는 항상 Call by Value 방식이다.

자바스크립트에서 Call by Value, Call by Reference

자바스크립트는 원시 값일 경우 Call by Value, 참조 값일 경우 Call by Reference 방식으로 전달한다.

원시 값 : number, string, boolean, null, undefined, symbol
참조 값 : Object, Array, Function, Date, RegExp, Map, Set

의문점

  1. 위에서 자바스크립트는 항상 Call by Value 방식이라고 했는데 참조 값일땐 Call by Reference 방식을 쓴다? 그러면 두 방식 다 사용하는게 아닌가라고 생각할 수 있다.

    거기에 대한 답은 아래와 같다.

    포인터와 Call by Reference 개념을 가진 C, C++ 같은 언어에서는 완전한 주소 값으로 연결되어 있다.

    하지만 자바스크립트는 주소 값을 참조하는 것 같지만 주소 값의 복사본을 만들어서 전달한다. (관련해서 Call by Sharing 이라는 개념도 있지만 여기선 작성하지 않고 참고 링크를 걸어두겠습니다.)

    이러한 동작은 Call by Value 의 원리와 같이 메모리 공간에 저장되어 있는 값을 복사하여 전달한다는 점에서 자바스크립트는 항상 Call by Value 방식이다.

  2. 자바스크립트는 왜 Call by Value 방식을 선택했을까?

    자바스크립트의 방식은 주소 값의 복사본을 만들어서 전달하기 때문에 메모리 사용량이 늘지만 메모리 주소를 직접적으로 조작할 수 없어 메모리 안전성과 보안적인 이점을 제공하면서 객체지향 프로그래밍에서 객체와 같은 참조 값들을 다루는데 용이하다.

참고

'Call by value'와 'Call by reference' (feat. 자바스크립트)
[JS] 📚 Call by Value & Call by Reference (+ Call by Sharing)

profile
뉴비 개발 공부중

0개의 댓글