[Java] Java는 Call by reference가 없다
아래 내용 출처
public class Main {
static class A{
int val;
public A(int val) {
this.val = val;
}
}
public static void swap(A val1, A val2){
int val = val2.val;
val2 = val1;
val1.val = val;
}
public static void main(String[] args) {
A val1 = new A(100);
A val2 = new A(1);
System.out.printf("val1 : %d,\\t val2 : %d \\n",val1.val, val2.val);
swap(val1,val2);
System.out.printf("val1 : %d,\\t val2 : %d \\n",val1.val, val2.val);
}
}
console result
val1 : 100, val2 : 1
val1 : 1, val2 : 1
<aside>
📌 여기서 잘 봐야 하는 부분은 one의 val가 1로 변경되었다는 것이다. 이렇기 때문에 헷갈릴 수 있다. 하지만 one에서 val1으로 매개변수를 넘기는 과정에서 직접참조가 아닌, 주소 값을 복사해서 넘기기 때문에 이는 call by Value이다. 복사된 주소 값으로 참조가 가능하니 주소 값이 가리키는 개체의 내용이 변경되는 것이다.
</aside>
<aside>
❗ 이해하게 된 원리
Call by Value 값으로 호출 즉, 값을 복사한다. 원본 값에는 손상이 없다. Call by Reference 값을 직접 값을 참조한다. 즉, 원본 값에 손상이 있다. 위의 swap()문제에서는 val1이 직접 one을 참조하는 것처럼 보인다. 하지만 하지만 val2를 val1으로 변경했는데 변경되지 않는다. 이를 통해 알 수 있는 것은 원본의 값을 직접 참조 하지 않는다는 것이다. 복사하여 사용한다. 즉, val1이 one의 주소를 복사하여 들고와 사용한다는 것이다.
</aside>
조금 더 설명이 잘된 그림 예시

<aside> ❗ 결론적으로 val1, val2는 one, two의 주소를 복사하여 독자적으로 가지게 된다. call by value가 발생
</aside>

<aside>
❗ 여기서 val1을 통하여 내부의 val를 변경한다면 주소 값을 통하여 객체의 값을 변경한다.
</aside>

<aside>
❗ 그래서 val1과 val2를 swap()해도 val2의 값이 변경되지 않았던 이유는 각기 주소값을 복사하여 사용하여 변수 별로 독립된 변수이기 때문이다.
</aside>
<aside> 📌 즉, JAVA는 Call by Value 이다. 라고 해버리면 오해가 생길 수 있으니 전달방식이 Call by Value라고 하겠다.
</aside>