JAVA의 경우
Call by Value
동작방식 :원시 자료형
(int, short, long, float, double, char, boolean)Call by Reference
동작방식 :참조 자료형
(Array, Class, Instance)
void func(int n) {
n = 20;
}
void main() {
int n = 10;
func(n);
printf("%d", n);
}
> 결과값 : 10
void func(int *n) {
*n = 20;
}
void main() {
int n = 10;
func(&n);
printf("%d", n);
}
> 결과값 : 20
C/C++ : 생성한 변수마다 새로운 메모리 공간을 할당하고 값을 덮어씌우는 형식으로 값을 할당. (*(변수)
: 포인터를 사용한다면, 같은 주소값을 가리킬 수도 있다.)
JAVA : 생성한 변수마다 새로운 메모리 공간을 할당(여기까지는 C/C++과 공통점), 다만 그 메모리 공간에 값
을 저장하지 않고 '''주소값'''을 저장한다. (값은 다른 메모리 공간에 할당됨) -> 변수 값을 수정할 때도, 주소값이 덮여쓰이기 때문에 원본 값에는 전형 영향이 가지 않는 것이다.
Call by value
의 경우, 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다. 하지만 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다.
Call by reference
의 경우, 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재한다.