1. Call by Value
- 함수 호출 시, 전달되는 변수 값을 복사해서 함수 인자로 전달하는 것
- 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value의 속성을 가지기 때문에 함수 안에서 인자 값이 변경되더라도 외부 변수 값은 변경되지 않음
void func(int n) {
n = 20;
}
void main() {
int n = 10;
func(n);
printf("%d", n);
}
2. Call by Reference
- 함수 호출 시, 인자로 전달되는 변수의 레퍼런스를 전달하여 함수 안에서 인자 값이 변경되면 아규먼트로 전달된 객체의 값도 변경되는 것
void func(int *n) {
*n = 20;
}
void main() {
int n = 10;
func(&n);
printf("%d", n);
}
3. Java 함수 호출 방식
- Java는 항상 Call by Value로 값을 넘기고, Reference Type(참조 자료형)을 넘길 시에는 해당 객체의 주소값을 복사하여 사용하기 때문에, 원본 객체의 프로퍼티까지는 접근이 가능하나 원본 객체 자체를 변경할 수 없다.
User a = new User("Hello");
foo(a);
public void foo(User b){
b = new User("World");
}
4. 정리
- Call by Value : 데이터 값을 복사하여 함수로 전달하기 때문에 원본 데이터가 변경될 가능성이 없지만 인자를 넘길 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹음
- Call by Reference : 메모리 공간 할당 문제는 없지만, 원본 값이 변경될 수 있다는 문제가 존재함