Call by value와 Call by reference는 함수 호출 시 매개변수가 전달되는 방식을 나타내는 용어이다.
1. Call by Value (값에 의한 호출):
- 매개변수로 전달되는 것은 값의 복사본이며, 호출된 함수에서 해당 값의 변경이 있어도 호출한 쪽에는 영향을 주지 않는다.
- 기본 데이터 타입(primitive type)을 매개변수로 전달할 때 발생한다.
public class CallByValueExample {
static void modify(int num) {
num = num + 10;
}
public static void main(String[] args) {
int number = 5;
modify(number);
System.out.println("Number: " + number); // 출력: Number: 5
}
}
modify 메서드는 매개변수 num의 값을 10 증가시키지만, 호출한 쪽에는 영향을 주지 않는다.
2. Call by Reference (참조에 의한 호출):
- 매개변수로 전달되는 것은 실제 값이 아니라 그 값이 저장된 메모리 주소(참조)이며, 호출된 함수에서 해당 값의 변경이 호출한 쪽에도 영향을 준다.
- 객체나 배열과 같은 참조 타입(reference type)을 매개변수로 전달할 때 발생한다.
public class CallByReferenceExample {
static void modify(int[] arr) {
arr[0] = arr[0] + 10;
}
public static void main(String[] args) {
int[] array = {5};
modify(array);
System.out.println("Array[0]: " + array[0]); // 출력: Array[0]: 15
}
}
배열(Array)은 동일한 메모리 주소를 가지고 있어 값의 변경이 호출한 쪽에도 영향을 주지만 int, String 등은 각자 다른 메모리 주소를 가지고 있기 때문에 호출한 쪽에 영향을 주지 않는다. ("문자".hashCode()로 메모리 주소 확인 가능)
요약:
- Call by value는 매개변수로 값의 복사본을 전달하므로 호출된 함수에서 매개변수 값을 변경해도 호출한 쪽에는 영향을 주지 않는다.
- Call by reference는 메모리 주소(참조)를 전달하므로 호출된 함수에서 매개변수 값을 변경하면 호출한 쪽에도 변경된 값이 반영된다.
- 자바에서는 기본 데이터 타입은 call by value이고, 객체는 call by reference의 형태로 동작한다. 하지만 엄밀히 말하면 자바는 항상 call by value이다. 호출 시에 값이 복사되어 전달되는 것이지, 실제로는 메모리 주소가 복사되는 것이 아니다. 객체의 경우에도 메모리 주소(참조)가 값으로 복사되어 전달되지만, 이 참조를 통해 객체의 상태를 변경할 수 있기 때문에 call by reference처럼 동작하는 것처럼 보이는 것이다.
'JAVA' 카테고리의 다른 글
[JAVA] Abstract (0) | 2024.03.26 |
---|---|
[JAVA] static (0) | 2024.03.25 |
[JAVA] 오버로딩(Overloading)과 오버라이드(Override) (0) | 2024.03.25 |
[JAVA] Class (0) | 2024.03.25 |
[JAVA] 예외 발생 Exception 및 그 밖의 Exception 종류 및 예시 (1) | 2024.01.10 |