1. Call by Value (값에 의한 호출)
1.1. 기본 개념
- 함수나 메서드를 호출할 때 변수의 실제 값을 복사하여 전달하는 방식이다.
- 복사된 값은 함수 내의 지역 변수로서 동작하므로 원본 변수와는 독립적이다.
1.2. Java에서의 Call by Value
- Java는 항상
call by value
방식으로 동작한다.
- 원시 타입 (int, double)은 실제 값이 복사되어 전달된다.
- 객체를 전달할 때는 해당 객체의 참조값이 복사되어 전달된다.
그러나 이는 참조값의 복사이므로 함수 내에서 참조값 자체를 변경하더라도 원본 참조에 영향을 주지 않는다.
2. Call by Reference ( 참조에 의한 호출)
2.1. 기본 개념
- 함수나 메서드를 호출할 때 변수의 참조(주소)를 전달하는 방식이다.
- 함수 내에서 참조를 통해 원본 변수의 값을 직접 변경할 수 있다.
2.2. C에서의 Call by Reference
- C 자체는 기본적으로
call by value
방식을 사용한다.
- 그러나 포인터를 사용하여 변수의 주소를 직접 전달하면
call by reference
와 같은 효과를 얻을 수 있다.
- 함수 내에서 포인터를 통해 원본 변수의 값을 변경하거나 포인터 자체를 다른 주소로 재할당하는 것이 가능하다.
3. 주요 차이점
- Java
참조값(주소와 유사한 개념)의 복사를 통해 객체를 전달하므로 함수 내에서 참조값 자체를 다른 객체의 참조값으로 변경해도 원본 참조에는 영향을 주지 않는다.
단 복사된 참조값을 통해 객체의 내용을 변경하면 원본 객체에도 영향을 미친다.
class SampleClass {
int value;
public SampleClass(int value) {
this.value = value;
}
}
public static void modifyReference(MyClass obj) {
obj = new MyClass(30);
}
public static void modifyObjectData(MyClass obj) {
obj.value = 20;
}
public static void main(String[] args) {
SampleClass obj = new SampleClass(10);
modifyReference(obj);
System.out.println(obj.value);
modifyObjectData(obj);
System.out.println(obj.value);
}
- C
포인터를 통해 변수의 주소를 전달하면 함수 내에서 포인터 변수 자체의 값을 변경할 수 있다.
이는 포인터를 다른 변수의 주소로 재할당하는 것을 의미한다.
void abc(int * p, int * b){
p = b;
}
#include <stdio.h>
void main() {
int a = 10;
int b = 20;
int *p;
p = &a;
printf("p points to value: %d\n", *p);
abc(p,&b);
printf("p points to value: %d\n", *p);
}