남는 시간에 pass by value 매커니즘을 좀 살펴봤다. 원리는 생각보다 간단한듯하다.
class A {
public static void main(String[] args) {
// #1
A a = new A();
// #2
call(a);
}
public void call(A parameter) {
// #3
parameter = new A();
}
}
parameter = a
따라서 #3 에서 parameter의 참조가 변해도 a는 그대로다.
물론 parameter를 리턴한다면 예상하는 결과가 나올 것이다.
이거 해보려고 별 짓 다해봤는데 원리는 참 간단했다. 디컴파일 시켜봐도 로컬 변수가 새로 생성되어있는데 이 점을 간과하고 있었던 것 같다.
가장 큰 착각은 값이 복사가 된다고해서 객체가 복사될 것이라 착각했던 것이다. 하지만 객체는 복사되지 않는다. 실제로 인스턴스 주소를 찍어보면 같은 주소가 나온다. 해쉬값도 똑같다.
call by sharing이라는 말을 이래서 사용하는 것 같다. deep copy가 아니라서 call by value만으로 설명하기에는 직관적이지 않다고 느껴진다.
Powered with by Gatsby 2.0