Call by value는 값에 의한 호출, 값이 복사되어 전달됩니다.
Call by reference 는 변수의 참조(주소값)가 전달됩니다.
C/C++에서는 기본형(Primitive)을 Call by value 방식으로 전달하고
참조자(&),포인터를 사용하여 Call by reference 방식을 지원합니다.
자바/자바스크립트 에서는 참조형인 경우 Call by reference 처럼 작동하지만,
C++에서의 참조자와 같은 개념이 없기 때문에 C++ 에서 말하는 Call by reference를 사용할 수 없습니다.
변수의 주소값이 아닌 데이터가 저장된 주소 자체를 복사해서 넘겨주기 때문에 Call by value 로 보는 것이 맞을 것 같습니다.
( 데이터의 주소값을 넘겨주기 때문에 call by address 라고도 합니다. )
자세한 내용은 아래에서 설명하겠습니다.
var num = 1;
var copy = num;
console.log(num, copy); //1 1
function save(copy) {
copy = copy + 1 ;
}
var num = 1;
save(num);
console.log(num); // num == 1
엄격하게 표현하면 변수와 같은 식별자는 메모리 주소를 기억하고 있기 때문에
변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달된다라고 볼 수 있습니다.
이처럼 데이터 자체 값이 아닌 메모리 주소를 전달하고, 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있게 된다.
또한 해당 값은 서로 다른 메모리 공간에 저장되는 것이 Call by value의 특징입니다.
(파이썬의 경우는 한쪽의 변수에 재할당이 이루어진 경우 서로 다른 메모리에 저장)
var person = {
name: 'Park'
};
var copy = person;
copy.name = 'JINY';
console.log(person); // JINY
public class Main {
static class Person{
public String name;
public Person(String name){
this.name = name;
}
}
static void swap(Person p1 , Person p2){
p1.name = "박"; // "박진영 -> 박" 으로 변경
p2 = p1; // p2 는 Park 를 가지고 있다가 p1을 할당
}
public static void main(String[] args) {
Person p1 = new Person("박진영");
Person p2 = new Person("Park");
System.out.println(p1.name);
System.out.println(p2.name);
}
}
#include <iostream>
using namespace std;
class Person
{
public:
string name;
};
void SwapName(Person &p1, Person &p2){
Person tmp = p1; //PARK 저장
p1 = p2; //person1 JINY 으로
p2 = tmp; // person2 PARK 저장
// Person tmp = p1;
// p1 = p2;
// p2 = tmp;
}
int main()
{
Person person1;
Person person2;
person1.name = "PARK";
person2.name = "JINY";
SwapName(person1, person2);
cout << "a : " << person1.name << endl; // JIN
cout << "b : " << person2.name << endl; // PARK
}