JVM

[Java] 자바는 Call by Value

kyoulho 2025. 5. 17. 20:56

 

  • 자바는 기본형(primitive이든, 참조형(reference type이든 무조건 "값"을 복사해서 함수에 전달합니다.
  • 차이점은 기본형은 실제 값, 참조형은 객체의 주소(참조값)가 복사된다는 점입니다.
  • 참조값 복사는 "Call by Reference 아니야?"라는 오해가 생길 수 있습니다.. 특히 객체나 배열을 다룰 때 원본이 바뀌는 것을 보고 더 혼란스러울 수 있죠.


기본형: 값 자체가 복사됨

void change(int x) {
    x = 10;
}

int a = 5;
change(a);
System.out.println(a);  // 출력: 5
  • a의 값이 x로 복사됩니다.
  • 함수 안에서 x를 변경해도 a는 영향을 받지 않습니다.


참조형: 참조값(주소)이 복사됨

void change(int[] arr) {
    arr[0] = 99;
}

int[] a = {1, 2, 3};
change(a);
System.out.println(a[0]);  // 출력: 99
  • a가 가리키는 배열의 주소가 arr에 복사됩니다.
  • arr과 a는 같은 배열을 가리키므로, 내부를 수정하면 서로 영향을 줍니다. 이게 call by reference 처럼 느껴질 수 있습니다.

하지만 참조 자체를 바꾸면?

void reassign(int[] arr) {
    arr = new int[] {9, 9, 9};  // arr이 다른 배열을 가리킴
}

int[] a = {1, 2, 3};
reassign(a);
System.out.println(a[0]);  // 출력: 1
  • arr = ...은 arr 변수만 바꾸는 것
  • a는 여전히 원래 배열을 가리키고 있음 → 영향 없음