- Call by Value와 Call by Reference의 차이
all by Value (값에 의한 호출)
- Call by Value는 가장 일반적인 함수 호출형태로 값을 복사하는 것 이다.
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int a1 = 10;
int a2 = 20;
swap(a1, a2);
cout << "a1: " << a1 << " a2: " << a2 << endl;
Call by Reference (참조의 의한 호출)
- 간단하게 한줄로 요약하자면 변수의 주소를 전달하는 것 이다.
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int a1 = 10;
int a2 = 20;
swap(&a1, &a2); //주소값을 넘김
cout << "a1: " << a1 << " a2: " << a2 << endl;
java는 call by reference가 아니다.
- 결론부터 말하자면 java는 항상 call by value이다. 흔히 java의 오해를 살 수 있는 부분을 살펴보자.
public class CallByValue {
public static void main(String[] args) {
Person p = new Person("wonwoo");
System.out.println("p.name: " + p.name);
callByValue(p);
System.out.println("p.name: " + p.name);
}
public static void callByValue(Person p) {
p.name = "kevin";
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
위의 내용을 call by value로
public class CallByValue {
public static void main(String[] args) {
Person p = new Person("wonwoo");
System.out.println("p.name: " + p.name);
callByValue(p);
System.out.println("p.name: " + p.name);
}
public static void callByValue(Person p) {
p = new Person("kevin");
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
위에서 내용이 call by reference에 의한 변경이다 이게 되야 call by reference라는 것이다.