Call by Value

이원석·2022년 4월 23일
0

Java

목록 보기
5/9
post-thumbnail

call by value와 call by reference는 함수 호출 시 인자(parameter)를 전달하는 방식을 뜻합니다.


1. Call by Value


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;
}

위 코드를 실행하면 출력 결과는 x: 1, y: 2가 됩니다. swap 함수 내에서 a와 b의 값이 변경되더라도, 원본 변수 x와 y의 값은 변경되지 않기 때문입니다.





2. Call by Reference


반면, 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;
}

위 코드를 실행하면 출력 결과는 x: 2, y: 1이 됩니다. swap 함수 내에서 a와 b의 값을 변경함으로써, 원본 변수 x와 y의 값도 변경되기 때문입니다. 이때, swap 함수의 인자로 변수의 주소(&x, &y)를 전달합니다. 이렇게 함수에 변수의 주소를 전달하면, 함수 내에서 해당 변수를 포인터(pointer)로 참조할 수 있습니다.

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

0개의 댓글