어 나 갱수.

[Java] Call by value, Call by reference 차이 🤚 본문

Java

[Java] Call by value, Call by reference 차이 🤚

김경수 2024. 1. 31. 22:33
728x90

 

오늘은 Call by value와 Call by reference의 차이를 알아보고 자바에서는 어떻게 사용되는지 알아보겠습니다.

 

함수를 호출하는 방법은 크게 두 가지가 있습니다.

Call by value(값의 의한 호출), Call by reference(참조의 의한 호출)

 

Call by value(값의 의한 호출)는 인자로 받은 값을 복사하여 처리합니다. Call by reference(참조의 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 줍니다.

 

Call by value는 말 그대로 호출 시 자신의 값을 복사해서 넘겨주는 방식이고 Call by reference는 자신의 값이 아닌 자신을 직접 공유해서 사용하도록 허용하는 개념이다.

 

Call by value(값의 의한 호출)

Call by value는 함수가 인수로 전달받은 값을 복사하여 처리하는 방식이다.

이는 변수가 가진 값을 복사하여 전달하므로 함수 내에서 값을 변경하여도 원본 값은 변경되지 않는다. 불변성을 유지하는데 용이하다.

public class Main {

    public static int addOne(int x) {
        x += 1;
        return x;
    }

    public static void main(String[] args) {
        int num = 5;
        System.out.println(addOne(num)); // 6
        System.out.println(num); // 5
    }
    
}

 

위에 코드를 보면 addOne이라는 함수에서 인자로 x를 받아서 x의 값을 변경하여도 num의 값은 바뀌지 않는다. 이렇게 num의 값을 복사해서 x에게 넘겨주어 addOne이라는 함수를 처리하는 방식을 Call by value라고 한다.

 

장점 : 값을 복사해서 처리하기 때문에 안전하다. 

단점 : 복사하여 처리하기 때문에 메모리 사용량이 늘어난다.

Call by reference(참조의 의한 호출)

Call by reference는 함수가 인수로 전달받은 값을 참조해서 반환하면 그 참조값으로 값을 처리하는 방식이다.

function addOne(arr) {
  arr.push(1);
  return arr;
}

let nums = [1, 2, 3];
let result = addOne(nums);
console.log(result); // Output: [1, 2, 3, 1] (modified array returned by addOne)
console.log(nums);   // Output: [1, 2, 3, 1] (original array is also modified)

 

위의 코드는 JavaScript입니다. JavaScript에서는 배열이 참조로 전달되므로 원래의 nums라는 배열을 수정합니다.

JavaScript에서는 배열을 인수로 전달할 때 참조로 전돨되므로 addOne함수 내에서 인수로 전달받은 배열을 수정하게 되면 인수로 넘겨준 기존의 배열값도 수정됩니다. 

 

장점 : 복사하지 않고 값의 주소를 참조하기에 빠르다.

단점 : 값의 주소를 복사해서 처리하기에 기존의 값이 영향을 받는다.

 

자바에서의 Call by value, Call by reference

C언어에서는 포인터를 이용해서 매개변수의 주소값을 넘겨 참조할 수 있다.

자바에서는 포인터가 없기 때문에 Call by value이다.

 

마무리

Call by Value의 경우 값을 복사해서 인자로 넘겨주기 때문에 원본이 변경될 가능성은 없지만, 복사를 할 때마다 새로운 메모리 공간을 할당해야 하기 때문에 메모리 측면으로 보면 손해이다.

Call by Reference는 공간 할당 문제는 해결될지 몰라도 값의 주소값을 넘겨주기 때문에 원본값이 변경될 가능성이 높습니다.

728x90