자바는 Call by value 일까? Call by reference 일까?
Call by Value
- 함수에 인자를 전달할 때 인자의 실제 값이
복사
되어 매개변수에 저장된다. - 이렇게 복사된 값은 함수 내에서 지역 변수로 사용된다.
- 함수 내에서 이 값을 변경해도 원래 변수의 값은 영향을 받지 않는다.
- 장점
- 원본 데이터가 변경될 위험이 없어 안전하다.
- 함수가 자신만의 데이터 복사본을 가지므로 부작용이 없다.
- 단점
- 큰 데이터를 복사할 때 성능과 메모리 사용량이 증가할 수 있다.
Call by Reference
- 함수에 인자를 전달할 때 인자의 메모리 주소가 전달된다.
함수 내에서 해당 주소를 통해 직접 원본 데이터를 변경할 수 있다.
- 장점
- 큰 데이터를 복사할 필요가 없어 성능과 메모리 효율성이 높아진다.
- 함수를 통해 원본 데이터를 쉽게 수정할 수 있어 유용하다.
- 단점
- 함수가 원본 데이터를 변경할 수 있기 때문에 예기치 않은 부작용이 발생할 수 있다.
- 프로그램의 흐름을 추적하기 어렵다.
자바
- 자바는
Call by Value
이다. Primitive Type
(기본 자료형)과Reference Type
(참조 자료형) 모두Call by Value
다.
기본 자료형
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
public static void main(String[] args) {
int n = 10;
System.out.println(n); // 10
plus(10);
System.out.println(n); // 10
}
public static void test(int n) {
n += 1;
System.out.println(n); // 11
}
}
- 기본 자료형값이 바뀌지 않는걸 볼 수 있다.
참조 자료형
- 자바에서 배열과 객체는 메모리의 특정 위치에 저장되어 있고, 할당된 변수는 그 메모리 위치를 가리키는 주소를 저장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
for (int num : arr) System.out.print(num + " "); // 1 2 3
System.out.println();
test(arr);
for (int num : arr) System.out.print(num + " "); // 10 20 30
}
public static void test(int[] a) {
for (int i = 0; i < a.length; i++) {
a[i] *= 10;
}
}
}
- 참조 자료형의 경우 주소값이 전달되었기 때문에 원본이 영향을 받는다는 것을 볼 수 있다.
call by reference
라고 헷갈릴 수 있지만 배열, 객체의 주소값의복사본
이 전달되므로 엄밀히 따지면call by value
다.
call by reference 인 C++ 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
void swap(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 10;
int b = 20;
cout << "Before swap - a: " << a << ", b: " << b << endl; // Before swap - a: 10, b: 20
swap(a, b);
cout << "After swap - a: " << a << ", b: " << b << endl; // After swap - a: 20, b: 10
return 0;
}
&
를 이용하여 변수의 주소값을 전달하고 있다.복사본이 아니다.
누군가가 물어본다면
Call by Value
는 함수에 인자를 전달할 때 인자의 실제 값이 복사되어 전달되는 방식입니다. Call by Reference
는 함수에 인자를 전달할 때 인자의 메모리 주소 값이 전달되는 방식입니다. 자바는
Call by Value
입니다. This post is licensed under CC BY 4.0 by the author.