프로그래밍을 하다 보면 "call by value"와 "call by reference"라는 두 가지 주요한 함수 매개변수 전달 방식에 대해 마주치게 됩니다.
이는 함수나 메서드에 값을 전달하는 방식에 따라 함수 내에서 변수의 값을 변경했을 때 원본 데이터에 어떤 영향을 미치는지를 결정합니다.
특히, Java에서는 이에 대한 이해가 중요한데, Java는 이 두 개념을 어떻게 적용하는지에 대해 자주 오해가 있습니다.
"Call by value" 방식에서는 함수로 인자를 전달할 때 인자의 실제 값의 복사본을 생성하여 전달합니다.
이 방식에서는 함수 내에서 매개변수의 값을 변경해도 원본 인자의 값에는 아무런 영향을 주지 않습니다.
즉, 원본 데이터는 보호되며, 함수는 전달된 값의 복사본으로 작업을 수행합니다.
public void addTen(int number) {
number += 10; // number는 복사된 값이므로 원본 값에 영향을 주지 않음
}
반면 "Call by reference" 방식에서는 함수로 인자를 전달할 때 인자의 메모리 주소를 전달합니다.
따라서, 함수 내에서 매개변수를 통해 해당 메모리 주소의 값을 변경하면, 원본 인자의 값도 함께 변경됩니다.
이는 함수가 원본 데이터를 직접 수정할 수 있음을 의미합니다.
void addTen(int *number) {
*number += 10; // 메모리 주소를 통해 값을 직접 변경
}
Java에서 모든 함수 호출은 기본적으로 "call by value" 방식으로 이루어집니다.
Java에서 기본 데이터 타입(primitive types)은 값 자체가 함수에 전달되며, 객체는 객체의 참조(메모리 주소의 값)가 복사되어 전달됩니다.
그러나, 이는 객체 자체가 아닌 객체의 참조의 "값"이 복사되어 전달되는 것이므로, 엄밀히 말하면 Java는 "call by reference"를 사용하지 않습니다.
public class Example {
public static void modifyNumber(int num) {
num += 10;
}
public static void modifyObject(MyObject obj) {
obj.setAttribute("Modified");
}
public static void main(String[] args) {
int number = 5;
MyObject myObj = new MyObject();
modifyNumber(number); // number의 값은 변경되지 않음
modifyObject(myObj); // myObj의 속성은 변경됨
}
}
Java에서는 모든 것이 "call by value"로 처리됩니다.
기본 데이터 타입은 값이 직접 전달되며, 객체는 객체 참조의 값이 전달됩니다.
이러한 Java의 함수 호출 방식 이해는 프로그래밍 시 변수와 객체의 동작을 예측하는 데 매우 중요합니다.
따라서, Java에서는 객체의 상태를 변경할 수 있지만, 이는 객체 참조의 "값"이 함수에 전달되기 때문이며, Java가 "call by reference"를 사용하지 않는다는 점을 명심해야 합니다.
출처 :
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93
https://bcp0109.tistory.com/360
https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference
https://velog.io/@tilsong/Java-Call-by-value-Call-by-reference