JAVA

7. Call by Value vs Call by Reference

ggomjiu 2025. 3. 28. 12:25

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

https://sorjfkrh5078.tistory.com/278

'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