call by value와 call by reference는 함수 호출 시 인자(parameter)를 전달하는 방식을 뜻합니다.
call by value는 값을 복사하여 전달하는 방식입니다. 함수가 호출될 때, 해당 변수의 값만을 복사해서 전달합니다. 따라서 함수 내에서 해당 값을 변경해도 원래 변수의 값은 변경되지 않습니다. 이 방식은 원본 데이터의 보호에 용이하며, 동시에 함수의 결과가 예측 가능하다는 장점이 있습니다.
예를 들어, 아래의 코드에서 swap 함수는 두 개의 인자를 전달받아, 각각의 값을 교환하는 역할을 합니다.
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1;
int y = 2;
swap(x, y);
printf("x: %d, y: %d", x, y);
return 0;
}
반면, call by reference는 값을 참조하여 전달하는 방식입니다. 함수가 호출될 때, 해당 변수의 메모리 주소를 전달합니다. 함수 내에서 해당 주소에 저장된 값을 변경하면, 원본 변수의 값도 함께 변경됩니다. 이 방식은 복사본을 만들 필요 없이 원본 데이터를 직접 조작할 수 있어 편리합니다.
예를 들어, 아래의 코드에서 swap 함수는 두 개의 인자를 전달받아, 각각의 값을 교환하는 역할을 합니다.
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 1;
int y = 2;
swap(&x, &y);
printf("x: %d, y: %d", x, y);
return 0;
}
Java는 항상 Call by Value 방식을 사용합니다.
따라서 전달받은 참조변수의 속성은 변경할 수 있지만, 객체 자체를 새로운 객체로 변경할 수는 없습니다.
- 기본타입의 경우 해당하는 변수의 값을 복사하여 전달한다.
- 참조타입의 경우 해당하는 객체의 필드가 가지는 값이 레퍼런스 이므로 넘길 때 객체의 필드가 가지고 있는 레퍼런스가 복사되어 전달된다.
[참고문헌]
https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md
https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference