Call by value와 Call by reference 차이

동동주·2024년 4월 5일

CS스터디_자바

목록 보기
8/19


함수 호출 방법들

Call by value(값에 의한 호출)

function addOne(x) {
  x += 1;
  return x;
}

let num = 5;
console.log(addOne(num)); // 6
console.log(num); // 5
  • 인자로 받은 값을 복사하여 처리한다.
  • 장점: 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존된다.
  • 단점: 복사하기 때문에 메모리 사용량이 늘어난다.

Call by reference(참조에 의한 호출)

function addOne(arr) {
  arr.push(1);
  return arr;
}

let nums = [1, 2, 3];
let result = addOne(nums);
console.log(result); // 출력: [1, 2, 3, 1]
console.log(nums); // 출력: [1, 2, 3, 1] (원본 값도 함께 변경됨)
  • 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.
  • 장점: 복사하지 않고 직접 참조를 하기에 빠르다.
  • 단점: 직접 참조를 하기에 원래 값이 영향을 받는다.

Call by reference 단점의 보완

원래 값이 영향을 받는 단점을 보완하려면 어떻게 해야할까?
-> 깊은복사(deep copy)를 이용하는 방법!

function changeName(obj) {
  obj = JSON.parse(JSON.stringify(obj)); // 깊은 복사
  obj.name = 'John';
  return obj;
}

let person = { name: 'Jane', age: 25 };
let result = changeName(person);
console.log(result); // 출력: { name: 'John', age: 25 }
console.log(person); // 출력: { name: 'Jane', age: 25 } (원본 값은 변경되지 않음)
  • 위 코드는 함수 호출 시 인수로 전달되는 변수의 참조 값을 함수 내부로 전달하되 참조 객체를 깊은복사를 통해 전달하여, 원본의 불변성을 지킬 수 있다.
  • 물론 단점의 보완을 위해 복사를 사용하게 되면 메모리를 소모하게 되고, 속도의 장점을 잃어버릴 수 있다. 따라서 깊은 복사와 콜바이레퍼런스를 함께 사용할 때는 상황에 따라서 적절히 선택해야 할 것이다.

출처:
https://sudo-minz.tistory.com/91
https://velog.io/@kwontae1313/JS%EC%9D%98-Call-by-Value-%EC%99%80-Call-by-Reference

0개의 댓글