To Dare Is To Do!
Call by value와 Call by reference 본문
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 |