펭귄집

참조에 의한 호출방식 (Call By Value)


기본타입과 참조타입의 경우는 함수 호출반식도 다름

기본타입의 경우는 값에의한호출(call by value)방식
-> 즉, 함수를 호출할 때 인자로 기본타입의 값을 넘길 땐, 호출된 함수의 매개변수로 복사된 값이 전달

=> 때문에 함수 내부에서 매개변수를 이용해 값을 변경해도, 실제로 호출된 변수의 값이 변경되지는 않음

객체와 같은 참조타입의 경우 함수를 호출할 때 참조에의한 호출(call by Reference)방식으로 동작
-> 즉, 함수를 호출할 때 인자로 참조 타입인 객체를 전달할경우, 객체의 프로퍼티값이 함수의 매개변수에 복사X, 인자로 넘긴 객체의 참조값이 그대로 함수내부로 전달


=> 때문에 함수 내부에서 참조값을 이용해서 인자로 넘긴 실제 객체의 값을 변경할 수 있다.







var a = 100;

var objA = { value : 100 };

function changeArg(num, obj){
     num = 200;             //1번
     obj.value = 200;       //2번

     console.log(num);
     console.log(obj);
}

changeArg(a, objA);        //3번

console.log(a);
console.log(A);




출력결과
200
{value : 200}
100

{value : 200}




3번에서 changeArg()함수를 호추하면서 인자값으로 기본타입인 숫자를가진 변수 a와 참조타입인 객체objA를 넘김

1번과 2번처럼 함수 내부에서 매개변수 num과 obj를 이용해 인자로 전달된 a와 objA.val의 값을 100에서 200으로 바꿨지만, 함수 호출이 끝난후에는 참조타입인 객체 objA.value 프로퍼티만이 실제 값으로 변해있다는 걸 알 수 있음

함수 내부에서 매개변수num을 이용해서 100을 200으로 바꿔도 변수a의 값은 변하지 않음

객체의 경우는 매개변수obj로 objA가 참조하는 객체의 위치 값이 그대로 전달되므로 실제 객체의 value 프로퍼티값이 changeAtr()함수 호출 후에도 적용 되는 것





<참고문헌 : 인사이드자바스크립트>