Call by Sharing
인자의 레퍼런스(또는 포인터)를 복사해서 사용하는 함수 호출 방식이다.
파이썬에서는 모든 타입을 Call by Sharing으로 전달한다. print_arg를 실행하면 인자로 전달된 객체의 레퍼런스 카운트가 증가(2 -> 4)함을 확인할 수 있다.
// python
import sys
def print_arg(arg):
print(id(arg), sys.getrefcount(arg))
a = 9999
print(id(a), sys.getrefcount(a)) # 4416168912 2
print_arg(a) # 4416168912 4
b = [1,2,3]
print(id(b), sys.getrefcount(b)) # 4416560768 2
print_arg(b) # 4416560768 4
js 에서는 참조 타입을 인자로 전달할때 사용된다(원시 타입은 Call by value로 동작). 객체 내부 값을 수정(modifyObject
) 하는 경우 원래 객체가 변하지만, 다른 객체를 할당 하는 경우(replaceObject
) 원래 객체에는 영향 주지 못함을 확인할 수 있다.
// js
function modifyObject(obj) {
obj.value += 10;
}
let myObject = { value: 10 };
modifyObject(myObject);
console.log(myObject.value); // 20
function replaceObject(obj) {
obj = {value: 30}
}
replaceObject(myObject);
console.log(myObject.value); // 20