public class CallByVALUE {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
swap(a, b);
System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
}
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
}
값은 바뀌지 않는다.
외부에 있는 a,b와 파리미터로 받는 x,y는 서로 다른 공간을 생성하기 때문
값(메모리)을 복사하여 새로운 메모리 공간을 생성하였다.
public class CallByReference {
int value;
CallByReference(int value) {
this.value = value;
}
public static void swap(CallByReference x, CallByReference y) {
int temp = x.value;
x.value = y.value;
y.value = temp;
}
public static void main(String[] args) {
CallByReference a = new CallByReference(10);
CallByReference b = new CallByReference(20);
System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
swap(a, b);
System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
}
}
값이 변한다.
클래스나 배열 형태는 변한다.
해당 객체의 주소값을 직접 넘기는 게 아닌 객체를 보는 또 다른 주소값을 만들어서 넘긴다.
이 관점에서 call by reference 처럼 동작하지만 결국 값을 복사(원 객체의 주소값)하여 메모리에 올려둿고 서로 다른 주소값을 가지고 있기 때문에
자바는 call by value 이지만 call by reference 처럼 동작하는게 있다라고 표현할수 있다.