언어/자바스크립트

JavaScript Call by value Call by reference

realtrynna 2023. 1. 12. 23:28

JavaScript Call by value Call by refrence

Call by value와 Call by refrence는 각각 값 전달, 참조 전달 로 불리며, 변수, 객체 등이 함수에 인자(Argument)로 들어가 매개 변수(Parameter)를 어떤 식으로 전달  할지 결정하는 방식이다.

 

 

Parameter와 Argument

  • Parameter (매개 변수)
    함수 선언부에 정의되고, 호출 시 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수
    매개 변수의 전달 방식으로 Call by value, Call by Reference가 있다.
  • Argument (인수)
    함수 호출부에 정의되고, 호출 시 함수로 값을 전달해 주는 변수

 

 

Call by value (값 전달, 값에 의한 호출)

Argument를 Parameter로 전달하면 새롭게 생성된 Parameter에 전달받은 값이 복사가 되어 저장된다.

Parameter에 저장된 값은 복사본으로 함수 내부에서 값이 변경되어도 원본 값에 영향을 주지 않는다.

 

매개 변수(Parameter)가 기본형(String, Number, Boolean, Null, Undefined, Symbol)일 경우

Call by value 방식으로 넘어간다.

 

  • 장점 원본 값을 복사하므로 원본이 변경될 일이 없어 안전하다.
  • 단점 복사하므로 메모리 사용량이 늘어난다.
const originalValue = 30;

function increase(num) {
    num += 1;
}

increase(originalValue);

console.log(originalValue); // 30

 

 

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

원본 값이 존재하는 주소를 가리키는 값을 Argument로 넘겨 Parameter로 전달한다.

 

매개 변수(Parameter)가 참조형(Object, Array, Function)일 경우 

Call by reference 방식으로 넘어간다.

 

  • 장점 복사하지 않고 직접 참조하므로 빠르다.
  • 단점 직접 참조하므로 원본 값이 변경될 수 있다. (객체 자체는 변하지 않는다)
const originalValue = {
    name: "윤승근",
    age: 30,
};

changeAge(originalValue);

function changeAge(originalValue) {
    originalValue.age = "29";
}

console.log(originalValue.age); // 29

 

 

예외

Call by reference는 겉보기에 값의 주소를 참조하지만 실제로 주소값의 복사본을 만들어 넘긴다.

즉 자바스크립트는 객체의 속성값이 아닌 객체 자체의 변경을 허용하지 않는다.

const originalValue = {
    name: "윤승근",
    age: 30,
};

function changeAge(value) {
    value = undefined;

    console.log(value);
}

changeAge(originalValue);

console.log(originalValue.age); // 30

 

 

참고 자료

http://www.tcpschool.com/php/php_function_parameter

'언어 > 자바스크립트' 카테고리의 다른 글

JavaScript findLast findLastIndex  (0) 2022.12.16
JavaScript substr substring slice  (0) 2022.06.26
JavaScript Destructuring 구조 분해 할당  (0) 2022.06.10
JavaScript Array.isArray  (0) 2022.06.05
JavaScript ES Modules(ESM ES6)  (0) 2022.05.28