함수를 호출하는 방법에는 두 가지가 있다.
값에 의해 함수를 호출하는 Call by value, 값 참조에 의해 함수를 호출하는 Call by reference 두 가지가 있다.
좀 더 자세히 알아보자. 여기서 말하는 '값에 의한 호출'과 '참조에 의한 호출'은 무슨 말일까?
Call by value
값에 의한 호출은 함수를 호출할 때 매개변수로 받은 값을 복사하여서 호출하는 방식.
말 그대로 기존에 존재하던 데이터와 값만 같은 다른 데이터를 생성하는 것이다.
완전히 다른 데이터를 생성하여 인자로 넘겨주기 때문에 함수 내에서 인자값의 변경이 일어난다고 해도 기존 변수에는 아무런 영향이 없다.
Call by reference
참조에 의한 호출은 매개변수로 받은 값의 주소를 참조하여 해당 주소의 값을 호출하는 방식.
C언어에서 포인터 및 주소연산자를 활용하여 변수의 주소값을 함수의 인자로 넘겨주는 것이다.
인자로 받은 값의 주소를 참조하는 방식이기 때문에 함수 내에서 인자값의 변경이 발생하면 해당 주소값을 지닌 데이터가 변경된다. 따라서 주소값을 넘겨준 기존 변수 또한 변경된다.
Call by value vs Call by reference
각 호출 방법을 아래의 코드를 예시로 들어 실행해 보면...
public class Main {
public static void main(String[] args) {
int a = 5;
int[] b = {10};
callByValue(a);
callbyReference(b);
System.out.println("Call By Value: " + a);
System.out.println("Call By Reference: " + b[0]);
}
static void callByValue(int value) {
value += 10;
}
static void callByReference(int[] arr) {
arr[0] += 10;
}
}
다음과 같은 결과가 나온다. callByValue 함수의 경우 value 값을 복사하여 호출하였기에 변경된 데이터가 저장되지 않았고 기대하던 값이 나오지 않았다. 반면 callByReference 함수는 배열 자체를 인자로 넘기고 특정 인덱스의 값을 변형시켜 기대하던 값이 나온 것을 확인할 수 있다.
사실 자바로 Call by value와 Call by reference의 예시를 보여주는 것은 적절하지 않을 수 있다. 그 이유는 자바에는 Call by reference의 개념이 존재하지 않기 때문이다. 포인터 및 주소연산자(*, &)를 사용하여 변수의 주소값을 자유롭게 가져올 수 있는 C언어와 달리, 자바에는 포인터가 존재하지 않으며 주소값을 직접 넘기거나 가져올 수 없다. 따라서 자바에서는 Call by value로 변숫값을 복사해서 넘기거나, Call by address로 주소값을 복사해서 넘기는 방법을 활용한다.
Reference
Difference Between Call by Value and Call by Reference in C++ - Scaler Topics
Know all about the difference between call by value and call by reference in C++ and the ways to pass value to a function in this article by Scaler Topics.
www.scaler.com
☕ 자바는 Call by reference 개념이 없다 ❓
자바의 Call by Value / Call by Reference 프로그래밍을 하다보면 반드시 마주치는 것이 바로 call by value / call by reference 개념이다. 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐에 따라 반
inpa.tistory.com
https://yoojin99.github.io/cs/Call-by-Value-Call-by-Reference/
Call by value와 Call by reference의 차이
내가 하고 싶은 것을 하는 블로그
yoojin99.github.io
https://www.guru99.com/ko/call-by-value-vs-call-by-reference.html#what-is-call-by-value-method
값에 의한 호출과 참조에 의한 호출의 차이점
프로그래밍 언어에서 함수는 두 가지 방법으로 호출될 수 있습니다. 이는 값에 의한 호출과 참조에 의한 호출로 알려져 있습니다. 이 튜토리얼에서는 값에 의한 호출 방법이란 무엇입니까? R의
www.guru99.com
'Java' 카테고리의 다른 글
[Java] 문자열 클래스 (0) | 2024.02.03 |
---|---|
[Java] 직렬화(Serialization) (0) | 2024.01.31 |
[Java] 오토박싱(Autoboxing) & 오토 언박싱(Autounboxing) (0) | 2024.01.25 |
[Java] Primitive Type & Reference Type (0) | 2024.01.25 |
[Java] JVM과 컴파일 과정 (0) | 2024.01.20 |