
Call by Value(값에 의한 호출), Call by Reference(참조에 의한 호출)
영어로만 갑자기 들었을 때는 무슨 뜻인지 바로 생각이 안났던 두 가지 개념 알고보면 개발을 하면서 알게 모르게 경험적으로 구분해서 사용해왔던 개념이다.
함수에 전달되는 것이 변수의 값 자체이기 때문에, 함수 내에서 매개변수의 값을 변경하더라도 호출한 곳에 있는 변수의 값은 변하지 않습니다. 이는 함수 호출 시에 변수의 값을 복사하여 전달하기 때문입니다.
자바에서는 모든 기본 데이터 타입(primitive data type)들이 값에 의한 호출 방식을 따르기 때문에 (int, double, boolean)과 같은 기본 데이터 타입을 매개변수로 전달할 때는 해당 값 자체가 복사되어 전달되므로 함수 내에서 이 값을 변경하더라도 호출한 곳에 있는 변수의 값은 영향을 받지 않습니다.

위 예시에서 callByValue 함수 내에서 값을 20으로 변경하고 있으나, x라는 새로운 변수에 값이 복사되기 때문에 기존의 a 값은 변경되지 않습니다.
함수 호출 시 인수로 전달되는 변수의 참조 값을 함수 내부로 전달하는 방식입니다. 자바에서는 객체(Object)를 매개변수로 전달할 때 이루어지는 호출 방식으로 객체를 전달할 때는 객체의 참조(reference)가 전달되며, 이를 통해 객체의 속성을 변경하거나 메소드를 호출할 수 있습니다.
주의 : Java에서 객체의 경우, 변수에는 객체의 참조(reference)가 저장되어 있습니다. 이 경우 변수의 값은 객체의 참조이므로 객체의 내부 상태를 변경할 수 있습니다. 하지만 이는 객체의 복사본이 아니라 객체에 대한 참조를 복사한 것이므로 Call by reference가 아닌 Call by value 방식을 따르고 있습니다.

위 코드를 보면 myList를 callByReference에 전달해서 0번째 인덱스 값을 10으로 변경하니 기존의 myList 값이 변경된것을 확인할 수 있다.
두 객체의 주소 값이 일치하는지도 확인할 수 있다.

Call by Reference는 기존 객체에 영향을 끼친다. 그렇기에 원본의 불변성을 지킬 수 없어 데이터의 원본이 수정되는 일이 발생하게 된다.
해당 이슈를 개선하기 위해서는 깊은복사(deep copy)를 이용하는 방법이있다.