"Call by value"와 "call by reference"는 프로그래밍 언어에서 함수 호출 시 인수를 전달하는 방식을 나타내는 용어입니다.
Java에서 Call by value
public class CallByValueExample {
public static void changeValue(int x) {
x = 5;
}
public static void main(String[] args) {
int a = 3;
changeValue(a);
System.out.println(a); // 출력 결과는 3입니다. 함수 내에서 x 값 변경이 a에 영향을 주지 않습니다.
}
}
Java에서 Call by reference로 값 전달
import java.util.ArrayList;
public class CallByReferenceExample {
public static void changeList(ArrayList<Integer> list) {
list.add(4);
}
public static void main(String[] args) {
ArrayList<Integer> myList = new ArrayList<>();
myList.add(1);
myList.add(2);
myList.add(3);
changeList(myList);
System.out.println(myList); // 출력 결과는 [1, 2, 3, 4]입니다. 함수 내에서 list를 변경하여 호출자에도 영향을 줍니다.
}
}
요약하자면, 자바에서는 기본 데이터 타입을 전달할 때는 값이 복사되어 전달되고, 객체(참조 타입)를 전달할 때는 참조의 복사본이 전달되어 객체의 내용을 변경할 수 있습니다.
자바는 "call by value"입니다. 이는 메소드에 매개변수를 전달할 때, 기본 데이터 타입(primitive types)의 경우 값의 복사본을 전달하고, 객체(참조 타입)의 경우에는 참조(주소)의 복사본을 전달한다는 것을 의미합니다.
만약 메소드에 객체(참조 타입)를 전달할 때, 해당 객체를 변경하면 호출자(caller)에서도 변경 내용이 반영되는데, 이는 객체의 참조(주소)가 복사되어 전달되기 때문입니다. 그러나 이것은 결국 메소드에 전달되는 것이 참조의 복사이며, 이것은 Java에서의 "call by reference"가 아니라 "call by value"의 일종으로 이해됩니다.
중요한 점은 객체(참조 타입)를 전달할 때 참조(주소)의 복사본이 전달되어, 객체의 상태를 변경할 수 있다는 점입니다. 하지만 메소드 안에서 새로운 객체를 할당하거나 참조를 다른 객체로 변경하는 것은 호출자에게 영향을 미치지 않습니다. 이러한 특성 때문에 자바는 "call by value"로 분류됩니다.