Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

Call by value와 Call by reference 본문

Java

Call by value와 Call by reference

Nick_Choi 2024. 7. 29. 11:39

Call by value

- 메서드를 호출할 때 넘겨줄 변수(인자)를 지정하면, 메서드의 매개변수가 지정한 변수 값의 복사본으로 초기화되는 것

- 복사된 인자는 함수 안에서 지역적으로 사용되는 local value 속성을 가짐

- 함수내에서의 변경은 메서드를 호출할 때 지정한 변수에 영향을 미치지 않음

 

Call by reference

-  메서드를 호출할 때 넘겨줄 변수를 지정하면, 메서드의 매개변수가 지정한 변수의 래퍼런스로 초기화되는 것

-  함수 내에서의 변경은 메서드를 호출할 때 지정한 변수에 영향을 끼침

 

Java는 Call by value or Call by reference?

public class main
{
    public static void main(String[] args)
    {
        Sample sample = new Sample();

        int var = 1; // 원시 타입 변수 int
        int[] arr = { 1 }; // 참조 타입 변수 int[] 배열

        // 변수 자체를 보냄 (call by value)
        add_value(var);
        System.out.println(var); // 1 : 값 변화가 x

        // 배열 자체를 보냄 (call by reference)
        add_reference(arr);
        System.out.println(arr[0]); // 101 : 값이 변화 0
    }

    static void add_value(int var_arg) {
        var_arg += 100;
    }

    static void add_reference(int[] arr_arg) {
        arr_arg[0] += 100;
    }
}

 

다음의 코드 진행 과정을 살펴보면

1. main 스택 프레임에 두 변수가 담긴다.

이 때 원시 타입인 var은 원시값 그대로 1을, 참조 타입 arr은 실제 데이터를 heap 메모리에 저장하고 이를 참조할 수 있는 주소값을 stack 영역에 저장한다.

 

2. add_value() 메서드에 인자로 var을 넣어 호출

add_value() 메서드가 호출되면서 add_value 스택 프레임이 생성되고 그 안에 지역 변수 var_arg가 1을 받아 생성된다.

이후 로직에 따라 100을 더해 값이 101로 변경된다.

그러나 var_arg는 main 스택 프레임의 변수 var로부터 원시값을 복사하여 받았기 때문에 이에 대한 값의 변화는 var의 값에 영향을 미치지 않는다.

 

3. add_reference() 메서드에 인자로 arr을 넣어 호출

add_reference() 메서드가 호출되면서 add_reference 스택 프레임이 생성되고 그 안에 지역변수 arr_arg가 생성된다.

이러한 경우도 변수의 값이 복사되어 매개변수로 넘어가는데 이 때 arr이 가지고 있던 값은 주소값으로 매개변수에는 복사된 주소값이 들어온다.

따라서 arr과 arr_arg는 같은 주소값을 들고 있게 되며 결국 같은 데이터를 동시에 참조하는 상황이 된다.

이 때 로직에 따라 arr_arg[0]을 불러와 100을 더해주면 heap 영역에 있는 값은 101로 수정된다.

 

자바에서의 파라미터는 이렇게 원시값이 복사되는냐 주소값이 복사되느냐의 차이만 있을 뿐 결국 call by value로만 동작된다.

(자바에서는 개발자가 직접 메모리 주소에 접근하지 못함)

'Java' 카테고리의 다른 글

StringBuffer, StringBuilder, string  (0) 2024.08.04
동일성과 동등성  (0) 2024.07.30
추상클래스와 인터페이스  (0) 2024.07.27
자바의 타입 (원시타입, 참조타입)  (0) 2024.07.24
Checked Exception과 Unchecked Exception  (0) 2024.07.22