Call by value 와 Call by reference
Call by value는 값에 의한 호출을 의미하고, Call by reference는 참조에 의한 호출을 의미합니다.
Call by value는 원래 값이 수정되지 않고, 함수에 변수가 전달될 때 변수의 복사본이 생성되어 전달되고,
Call by reference는 함수에 변수 자체가 전달이 되어서 함수 내에서 변수 값이 변경 될 경우 원래 변수 값도 변경됩니다.
자바에서는?
자바에서는 Call by value만 존재하고, Call by reference는 존재하지 않습니다.
얼핏 보면 String이나 객체는 Call by reference로 불러오는 것 같지만 자바에서는 원래 할당된 참조는 수정되지 않습니다.
예시코드
public class Main {
public static void main(String[] args) {
MyObject a = new MyObject(5);
MyObject b = new MyObject(10);
System.out.println("호출 전: a = " + a.getValue() + ", b = " + b.getValue());
swap(a, b);
System.out.println("swap1 후: a = " + a.getValue() + ", b = " + b.getValue());
swap2(a, b);
System.out.println("swap2 후 = " + a.getValue() + ", b = " + b.getValue());
}
public static void swap(MyObject a2, MyObject b2) {
MyObject c = new MyObject(15);
b2 = c;
}
public static void swap2(MyObject a3, MyObject b3) {
int temp = a3.getValue();
a3.setValue(b3.getValue());
b3.setValue(temp);
}
}
결과
1. 새로운 객체가 할당되었을 때
위 코드를 보면 swap 메소드에서 새로운 객체를 만들어서 b2로 할당하고 있습니다.
만약 Call by reference 라고 한다면 swap 이후 출력값에서 b의 값이 15로 변경되어야 합니다.
하지만 참조값이 바뀐 것이 아니기 때문에 c, b2는 swap 메소드 안에서만 사용되고 가비지컬렉터의 수집 대상이 됩니다.
2. 객체를 통한 접근을 시도할 때
swap2를 보면 실제로 값이 변경되었습니다. 이걸보고 '어? call by reference 아냐?'라고 생각할 수 있는데요.
실제로는 '객체의 주소값'이 복사되어서 heap영역에 저장된 객체의 값을 변경 할 수가 있게 됩니다.
이렇게 변수가 할당이 되고, 주소값이 복사가 되어서 객체의 값을 바꿀순 있지만 a와 b가 참조하는 대상을 바꿀 수가 없는 것이죠.
call by reference에 의하면 메소드를 호출한 곳에서 변경도 원래 변수에 영향을 미쳐야 하는데 그렇지 않은 것을 알 수 있습니다.
결론
자바에서 모든 값 전달은 Call by value입니다.
참고자료
'Language > JAVA' 카테고리의 다른 글
String 클래스 파고들기 - 객체의 특성 및 더하기 연산의 버전별 차이 (0) | 2024.04.09 |
---|---|
String 클래스 파고들기 - String 생성과 byte 변환시 주의점 (0) | 2024.04.05 |
자바가 돌아가는 동작 원리 (0) | 2024.03.06 |
기본형 타입과 참조형 타입 (0) | 2023.02.21 |
추상 클래스 정리 (0) | 2022.10.24 |
남에게 설명할 때 비로소 자신의 지식이 된다.
포스팅이 도움되셨다면 하트❤️ 또는 구독👍🏻 부탁드립니다!! 잘못된 정보가 있다면 댓글로 알려주세요.