- 자바는 기본형(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는 여전히 원래 배열을 가리키고 있음 → 영향 없음
'JVM' 카테고리의 다른 글
[Java] 제네릭과 오버로딩, 왜 예상과 다를까? (1) | 2025.06.05 |
---|---|
Spring 서버가 자체 서명 SSL 서버와 통신할 때 생기는 문제와 해결 방법 (0) | 2025.05.29 |
[JVM] JDBC 쿼리 및 메서드 실행 로깅 (0) | 2024.08.17 |
[JVM] Jackson의 ObjectMapper: 객체 생성 방식과 필드 바인딩 (0) | 2024.08.10 |
[JVM] MockServer (0) | 2024.07.29 |