Develop Note by J.S.

[Javascript] Call by Value, Call by Reference, Call by Sharing 본문

Language/Javascript

[Javascript] Call by Value, Call by Reference, Call by Sharing

js-web 2023. 6. 20. 09:32
반응형

프로그래밍 개발에서 꼭 이해하고 넘어가야하는 부분입니다. 대부분의 프로그래밍 언어에서는 존재하는 개념인데요, 값에 의한 호출인지 메모리 참조에 의한 호출인지에 따라 동작이 달라지게 됩니다.

매개변수의 전달 방법, 변수 접근 방법, 특정 변수의 복사 등 어떠한 상황이던 구분해서 사용해야 합니다. 

Call by Value
 - 값의 의한 호출, 해당 변수가 가리키는 메모리 내에 들어있는 실제 데이터 (literal)를 사용한다. (ex. 깊은복사)

Call by Reference
 - 메모리 참조에 의한 호출, 해당 변수가 가리키는 메모리 번지를 사용한다 (ex. 얕은복사)

Call by Sharing
 - 함수의 매개변수의 타입(value or reference)과 반대의 타입으로 값을 재할당할 경우 메모리가 공유되지 않고 새로운 메모리로 재할당하여 함수 내에서 지역변수로 사용된다.

 

/** call by value (깊은복사- javascript는 원시값에 대하여 기본적으로 깊은복사)*/ 
let a = 1;
let func = function (b){
    b = 2;
    console.log('b: ', b);    
}
func(a);
console.log('a :', a);



/** call by reference (얕은복사)*/
let a = {};
let func = function (b){
    b.a = 1;
    console.log('b: ', b);    
}
func(a);
console.log('a :', a);



/** call by sharing () */
let a = {};
let func = function (b){
    b = 1;
    console.log('b: ', b);    
}

func(a);
console.log('a :', a);

얕은복사 예제에서 메모리 참조에 의하여 a가 객체형태(메모리 번지가 할당된 주소공간)로 초기화 된 상태이며 func(a)로 메모리번지 자체를 전달하였기 때문에 b.a =1; 로 값을 넣었을 때 동일하게 a 또한 바뀐것을 볼수 있습니다.

가장 아래 예제에 call by sharing에서 전달인자 a의 초기 type은 객체 (메모리 주소값) 였으나 func 함수내에서 리터럴 값을 대입하여 함수내의 b는 1이 들어있는데 다른 메모리 주소를 참조하는 형태로 사용됩니다. 

반응형

'Language > Javascript' 카테고리의 다른 글

[Javascript] 실행 컨텍스트  (0) 2023.06.27
[Javascript] 얕은복사, 깊은복사  (0) 2023.06.20
[Javascript] Async, Await  (0) 2023.06.19
[Javascript] Promise  (0) 2023.06.19
[Javascript] Callback  (0) 2023.06.16