본문 바로가기
Development/JavaScript

평가전략 (Evaluation Strategy)

by 개발자 데이빗 2022. 2. 11.

평가전략이란?

 

프로그래밍 언어에서 함수 호출의 argument의 순서를 언제 결정하고 함수에 어떤 종류의 값을 통과 시킬지 결정하는 것

 

parameter 와 argument의 차이

 

그동안 parameter와 argument를 명확히 구분하지 않고 혼용하여 사용했는데 둘의 차이는 아래 예시 코드의 주석을 통해 확인할 수 있다.

parameter는 함수 선언부에 정의 되고, arguments는 함수 호출부에서 사용된다.

 

let arg = 1;

let myFunc = function(param) { // parameter (매개변수)
  //...
};

myFunc(arg); // arguments (인자)

 

 

Call by Value - imutable

 

arguments로 값이 넘어올 때 복사된 값이 넘어온다.

caller가 인자를 복사해서 넘겨줬으므로 callee가 인자를 수정해도 caller는 영향을 받지 않는다.

자바스크립트는 기본적으로 원시값을 arguments로 넘겨주면 call by value의 형태로 작동한다.

 

let arg = 1;

let myFunc = function(param) { // callee
  param = param + 1;
}

myFunc(arg); // caller

console.log(arg); // 1

 

Call by Reference - mutable

 

arguments로 참조값(메모리 주소)이 넘어올 때는 참조값을 복사하지 않는다.

복사한 값을 넘긴게 아니라 참조하고 있는 메모리 주소를 넘겼기 때문에 같은 값을 바라보게 되고 callee가 해당 인자를 수정하면 caller가 영향을 받는다.

자바스크립트는 기본적으로 참조값을 arguments로 넘겨주면 call by reference의 형태로 작동한다.

간단한 프로젝트에서 함수의 동작을 완벽히 이해하고 있다면 문제 될 것은 없지만 다수의 개발자들이 협업하고 규모가 큰 프로젝트가 될수록 쉽지 않은 일이기 때문에 ES-Lint에는 parameter 수정을 제한하는 규칙이 있다.

ES-List no-param-reassign

 

let arg = {};

let myFunc = function(param) { // callee

  param.value = 1;

}

func(arg); // caller

console.log(arg.value); // 1

 

 

Call by Sharing

 

call by value의 특징과 call by reference의 특징을 둘 다 가진 평가전략이다.

arguments로 참조값을 넘긴 후 참조값을 수정하였음에도 값이 변하지 않는다.

arguments로 넘어온 참조값 (메모리 주소) 에 담긴 값을 수정할 수는 있지만 새로운 메모리 값으로 할당은 불가능하다.

즉, 동적 프로퍼티 할당을 시도하는 경우 위의 call by reference 처럼 실제 객체의 프로퍼티 값도 바뀌지만 재할당을 시도하면 우변의 값은 새로운 메모리에 올라가게 되고 좌변의 변수는 그 주소값을 가리키게 된다.

 

자바스크립트 외에도 Java, Ruby, Pyhton 등 언어의 펑가전략으로 사용된다.

 

let arg = {};

let myFunc = function(param) { // callee
  param = 1;
}

func(arg); // caller

console.log(arg); // {}

댓글