완벽한 다음 행보는 없다.

[Javascript] 평가전략 - Call by value, Call by reference, Call by sharing 본문

Javascript

[Javascript] 평가전략 - Call by value, Call by reference, Call by sharing

We On Fire 2023. 9. 12. 13:05

공부한 것들을 정리한 내용입니다. 출처는 하단에 있습니다. 문제 있을 시 알려주시면 조치하겠습니다!

 

평가전략

평가 전략(Evaluation Strategy)이란 프로그래밍 언어에서 함수 호출 시 전달한 arguments(인자)의 순서를 언제 결정하고, 어떤 종류의 값을 통과시킬 것인지 결정하는 방법이다.

 

Data type

자바스크립트에는 2종류의 데이터타입이 있다.

primitive data type(원시형) - number, string, boolean, undefined, null, symbol

참조 데이터 타입(Reference Data Types) - Array, Object, function, Date, RegExp, Map, Set 등 원시형을 제외한 나머지 데이터타입.

 

Call by value

  • 인자(Argument)가 원시타입일 때 - 값을 복사해서 넘겨준다.
// argument가 원시값인 경우
var a = 2;

var callee = (copiedValue) => { //callee
  copiedValue = copiedValue + 1;
};

callee(a); // caller
console.log(value); // 2

caller에서 argument를 받아 값을 복사한 뒤 callee의 parameter로 넘겨준다. 이 말은 인자를 새 메모리 영역에 복사하여 매개 변수에 전달한다는 뜻이다. 따라서 callee가 매개변수를 수정해도 caller는 영향을 받지 않는다. 그래서 callee의 로직에서 1을 더해도 코드 마지막 줄에서 기존의 a 값인 2가 찍히는 것을 볼 수 있다.

따라서 javascript 함수는 argument가 원시값일 경우 call by value 방식으로 평가된다고 볼 수 있다.

 

 

Call by reference

  • 인자(Argument)가 원시타입이 아닐 때(참조 타입일 때) - 인자의 메모리 주소를 파라미터로 넘겨준다.
function modifyArray(arr) { //callee
  arr.push(4);
}

let myArray = [1, 2, 3]; // 
modifyArray(myArray); //caller
console.log(myArray); // 출력: [1, 2, 3, 4]

caller의 argument 원본 객체의 메모리 주소를 callee로 넘겨준다. 따라서 argument, parameter가 같은 주소를 참조하고 있기 때문에 callee 내부에서 매개변수의 값을 조작하면 argument로 전달되었던 값에 변화가 있다.

 

Call by sharing

function change(value , ref1 , ref2){
  value += value
  ref1.name = 'changed'
  ref2 = { name : 'changed' }
}

var number = 1;
var object1 = { name : 'please change me'};
var object2 = { name : 'please change me'};

change(number,object1,object2)

console.log(number) // 1 => call by value
console.log(object1) // {name: 'changed'} => call by reference
console.log(object2) // {name: 'please change me'} => ?

number는 원시타입이라 call by value로 인해 값의 변화가 없다. 그리고 object1은 참조 데이터 타입이라 call by reference로 작동해 값이 변한 것 같다. 그러나 object2는 참조 데이터 타입인데 값이 변하지 않는다. 이에 대한 설명을 call by sharing으로 할 수 있다.

자바스크립트에서는 사실 참조값 자체를 전달할 수 없다. 자바스크립트는 참조값에 대한 복사본을 만들어서 전달한다. 그래서 매개변수로 넘어온 참조값을 통해 값을 찾아서 함수 내에서 수정할 수 있다(ref1.name) 그러나 새로운 값으로 할당(ref2)하게 된다면 우변의 값은 새로운 메모리에 올라가게 되고 좌변의 변수는 그 주소값을 가리키게 된다. 즉 런타임 중에 객체의 프로퍼티를 변경하는 동적 프로퍼티(ref1.name)가 가능하지만 함수 내에서 매개변수(ref2)에 새로운 객체나 값을 할당하게 되면 인자(object2)에는 아무런 영향이 가지 않는다.

 

출처

https://velog.io/@younoah/call-by-value-call-by-reference

https://think0wise.tistory.com/65

https://ajdkfl6445.gitbook.io/study/javascript/evaluation-strategy

https://think0wise.tistory.com/65

 

Comments