평가 전략 (Evaluation Strategy)
프로그래밍 언어에서 함수 호출 argument의 순서 혹은 함수에 어떤 값을 전달시킬지 등을 결정하는 것을 말한다. 보다 간단하게 표현하면 함수에 값을 넘겨줬을 때 함수가 어떻게 실행될 것인가를 다룬다고 생각하면 될 것이다. 우리가 'call by ~~'라고 표현하는 것들이 바로 평가 전략이라고 볼 수 있다.
Call by Value
parameter의 값이 복사되어 argument로 넘어가는 방식을 말한다. 전달된 것은 복사된 값이기 때문에 함수 내부에서 해당 값을 어떻게 변경해도 원본에는 영향이 가지 않는다.
Call by Reference
parameter로 reference(참조 주소, 메모리 주소)를 넘겨주는 방식을 말한다. reference 값을 전달받은 함수는 주소를 통해 직접 원본 데이터에 접근한다. 그렇기 때문에 함수 내부에서 argument를 수정해주면 원본 값이 영향을 받는다.
자바스크립트에서 언제 Call by Value가 적용되고 언제 Call by Reference가 적용되는지 이해하기 위해서는 우선 원시값과 참조값에 대한 이해가 필요하다.
원시값 (primitive value)
원시값은 자바스크립트의 원시 타입을 사용하는 데이터를 말한다. (string, number, boolean, undefined, null, symbol) 원시 타입의 데이터를 변수에 할당하면 메모리의 고정 크기에 저장된 값을 변수가 직접 가리킨다. 원시타입은 불변성을 가진다. 데이터가 바뀐 것처럼 보여도 실제로는 기존 값이 변하는 것이 아니라 새로운 메모리에 새로운 값을 넣은 후 변수가 새로운 메모리를 가리키는 것일 뿐이다.
참조값 (reference value)
원시 타입이 아닌 타입들을 사용하는 데이터이다. 대표적으로 배열, 객체, 함수가 있다. 변수의 크기가 동적이며 변수에 할당시 데이터의 주소가 저장된다. (힙 메모리상의 주소) 해당 주소를 참조하여 원하는 값에 접근하기 때문에 참조값이라고 부른다.
Call by Value vs Call by Reference
1. 원시값은 Call by Value가 적용된다.
2. 참조값은 활용하는 방식에 따라 Call by Value 혹은 Call by Reference가 적용된다.
(1) 참조값에 재할당을 하는 경우 Call by Value가 적용된다.
(2) 참조값의 내부 요소를 변경하는 경우 Call by Reference가 적용된다.
추가
객체 내부 프로퍼티를 변경하는 경우 데이터의 원본이 수정되기 때문에 변경된 객체를 반환하지 않아도 된다. 그렇지만 개인적인 생각으로는 변경된 객체를 리턴하는 방식을 선호한다. 그렇게 하면 함수가 내부적으로 작동하는 방식이 Call by Reference이던 Call by Value인지에 대해 사용자는 알 필요 없이 함수가 수행하는 기능에만 초점을 맞춘 채 원하는 데이터를 얻을 수 있다. 더 나아가자면 Call by Reference보다는 Call by Value를 활용하는 것을 지향한다. 원본을 손대는 작업은 수많은 side effect를 유발시킬 수 있기 때문에 매우 위험하다. 동일한 목적을 수행할 때 Call by Reference 함수를 Call by Value 함수로 바꿔주는 것은 그닥 어렵지 않다. 만약 person이라는 객체를 받아서 그 이름을 바꿔주는 함수를 만들 때 나라면 Call by Value가 적용된 changeName1 함수를 선택할 것이다.
'프론트엔드 기본개념 복습 > Javascript' 카테고리의 다른 글
[Javascript] ES6 (ECMASCRIPT 2015) (0) | 2022.03.04 |
---|---|
[Javascript] 콘솔 제대로 써먹기 (How to properly use console) (0) | 2022.03.03 |
[Javascript] 가비지 컬렉션 (Garbage Collection) (0) | 2022.03.02 |
[Javascript] 자바스크립트의 배열 (Array) (0) | 2022.03.01 |
[Javascript] 이벤트 위임 (Event Delegation) (0) | 2022.02.25 |