티스토리 뷰

자바

[Java] Call By Value와 Call By Reference

김쓰로그 2023. 2. 2. 14:58

데이터를 파라미터로 전달하는 방법에는 두 가지 방법이 존재한다.

 

Call By Value

함수 호출 시 파라미터로 값의 복사복을 전달한다.

호출 함수에서 해당 파라미터를 변경하거나 하더라도 실제 데이터에는 아무런 영향을 끼치지 않는다.

Call By Reference

함수 호출 시 파라미터로 전달되는 변수의 래퍼런스(주소)를 전달한다.

따라서 호출 함수에서 파라미터를 변경하면 실제 주소를 참조하여 원본 데이터가 변경된다.


그럼 자바는 Call By Value일까 Call By Reference일까?

 

결론부터 말하자면 자바는 Call By Value로서 동작한다.

인자로 넘기는 종류에는 기본 타입과 객체 두 가지가 존재한다.

 

"파라미터로 기본 타입을 넘기는 경우"

파라미터로 기본 타입을 넘기는 경우 JVM 스택영역에 전달하고자 하는 파라미터가 복사되고 

호출된 함수는 해당 데이터를 사용한다. 

 

"파라미터로 객체를 넘기는 경우"

출처:openhome.cc

자바에서 객체는 Heap 영역에 생성되고 Stack 영역에서 이를 참조하는 방식으로 사용된다.

그럼 "Heap영역에서 객체 데이터에 대한 복사가 일어난다는 건가?" 라고 생각할 수도 있지만 그것은 아니다.

출처:openhome.cc

여기서 복사되는 데이터는 객체 데이터가 아닌 객체를 참조하는 데이터가 복사되는 것이다.

즉, 동일한 객체를 참조하는 스택 영역의 데이터가 하나 더 생성되는 것이다.

 

따라서 호출된 함수에서 해당 데이터에 대한 참조를 바꾸더라도 원래 데이터의 참조는 변하지 않는다.

하지만 전달된 객체가 변경가능성을 남겨놨더라면(필드에 대한 setter메서드, public field 등) 호출한 함수에서 전달된 인자를 사용하여 원본 데이터를 변경할 수 잇다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함