Call by Value
: 함수의 인자를 전달할 때 값을 전달하는 방식
- 값만 전달하는 방식
- 전달받은 값을 복사하여 처리
-> 전달받은 값을 변경해도 원본은 변경되지 않음
Call by Reference
: 주소를 전달하는 방식
- 참조에 의한 호출
- 전달받은 값을 직접 참조
-> 전달받은 값을 변경하면 원본도 같이 변경됨
Java에서의 파라미터 전달 방법
- Call by Value 방식
- 데이터형 )
- 기본형(primitive type)
- Boolean Type(boolean)
- Numeric Type(short, int long, float, double, char)
- 참조형(reference type)
- Class Type
- Interface Type
- Array Type
- Enum Type
- 기본형을 제외한 모든 것들
- 기본형은 stack의 변수 안에 value 저장
- 참조형은 stack의 변수 값에는 객체의 주소 값, 객체는 별도의 heap 영역에 저장
- 기본형 : 원시 값 저장
- 참조형 : 실제 데이터는 heap 메모리에 저장되고, stack에는 주소값이 저장
- add_value내 var_arge가 바뀐 것
- var가 바뀐 것이 아님
- arr과 arr_arg가 같은 주소값
- 두 변수가 하나의 데이터를 동시에 참조
- Java는 C와 달리 포인터를 철저하게 숨겨 개발자가 직접 메모리 주소에 접근하지 못하게 함
=> Call by Reference라는 개념이 존재하지 않음
- 즉 Call by Value로 동작하면서 단지 원시값이 복사되느냐 주소값이 복사되느냐의 차이
- 위의 예시를 보면, 두 변수 안에는 같은 주소를 가지고 있을 뿐 두 변수는 서로 별도로 분리되어 존재
- add_reference()를 호출하면 arr의 주소값을 담아 새로운 변수를 선언
-> 단순히 주소값 복사
-> 각 변수는 서로 다른 scope에 존재
- But, Call by Reference이려면 두 변수가 완전히 같아야 함
cf) Java에 포인터가 없는 이유
1. 포인터를 사용하면 유연성과 성능을 향상시킬 수 있지만 안전성이 떨어지기 때문
2. GC가 실행될 때마다 Heap영역의 객체의 주소가 계속 변하기 때문
-Reference
'JAVA' 카테고리의 다른 글
9. Auto Boxing & UnBoxing (0) | 2025.03.28 |
---|---|
8. Mutable & Immutable (0) | 2025.03.28 |
6. Xms & Xmx (0) | 2025.03.28 |
5. JRE, JDK, JVM (0) | 2025.03.21 |
4. 다양한 GC (0) | 2025.03.21 |