function foo(parameter, param){
return parameter;
}
function main(){
let argument;
foo(argument, 10);
}
- 함수 호출시 전달되는 값
- 예제의 argument, 10이 전달인자
- 함수 호출시 인자를 받아들이는 변수
- 예제의 parameter, param이 매개변수
- 전달인자의 값(Value)을 매개변수로 복사해서 전달
- 매개변수로 복사해서 전달하기 때문에 함수 내부에서 값을 변경해도 원본 변경 불가능
- C/C++ 언어의 포인터에 해당하는 개념
- 전달인자의 주소값(Address)을 매개변수로 복사해서 전달
- 복사된 주소값을 이용해 Call by Reference처럼 주소를 참조하여 원본 변경 가능
- 그러나 결국 Call by Value처럼 값을 복사해와서 사용하므로 Call by Reference와 구분함
- C++의 참조자에 해당하는 개념
- 별칭(Alias)이라고도 불림
- 전달인자의 참조하는 영역에 대해 같은 참조(Reference)를 가리키는 매개변수 생성
- 같은 영역을 참조하고 있으므로 원본 변경 가능
- 같은 역할을 하고 비슷하게 쓰이니 둘의 차이를 구분하지 않고 Call by Reference로 사용할때가 많음
- 개인적으로 두 개념의 차이는 참조하는 영역의 변경 가능이라고 생각함
- Call by Address는 결국 주소값을 포인터 변수에 복사해 와서 쓰기 때문에 내부에서 지역변수 처럼 새로운 주소값을 할당해 사용 가능
- Call by Reference라고 불리는 참조자의 경우 컴파일을 하게 되면 결국 const 포인터로 변경되어 계산됨
- 따라서 둘 모두 원본 변경 가능 하지만 매개변수가 참조하는 영역 변경은 Call by Address만 가능함
- Java의 객체를 함수의 매개변수로 전달할때 보통 Call by Reference로 오해
- 그러나 정확히는 Call by Value, Call by Address와 유사하게 JVM Stack의 Value를 전달
- 따라서 Java에서는 이를 Pass By Value라고 명칭
- Python, JavaScript에서는이와 유사한 방식이지만 Call by Sharing 이라고 명칭