자바 Call by Value, Call by Reference

박우현 (Joshua)·2023년 7월 6일

항해99_TIL

목록 보기
20/20

📍Call By Value, Call By Reference

메서드 호출 시 파라미터 전달 방법으로는 call by value, 와 call by reference 가 있다. 공통적으로 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다.

Call By Value
call by value 는 함수 호출 시 전달되는 변수를 복사하여 함수의 인자로 전달한다. 호출 한 곳에서의 변수와 호출된 함수의 인자는 복사된 서로 다른 변수 이다. 이로 인해, 함수 안에서 인자 값이 변경되어도 외부의 변수 값은 변경 되지 않는다.

Call By Parameter
call by parameter 는 함수 호출 시 전달되는 변수의 참조(주소)를 함수의 인자로 전달한다. 참조를 직접 넘기기 때문에 호출 한 곳에서의 변수와 호출된 함수의 인자는 동일한 변수 이다. 이로 인해, 함수 안에서 인자 값이 변경되면 외부의 변수 값도 변경 된다.

그럼 자바에서의 파라미터 전달 방법은?
자바에서는 함수로 변수를 전달해서 수정하면, 외부에서도 수정이 되어 Call by Reference라 오해 할 수 있지만 사실은 Call By Value 로 작동한다.
이를 쉽게 이해하기 위해서는 JVM 메모리에 어떻게 변수가 저장 되어지는지 알아야한다.
Java 에서 변수를 선언하면 Stack 영역에 할당이 된다.

  • 원시 타입 (Primitive Type) 은 Stack 영역에 변수와 함께 저장되며
  • 참조 타입 (Reference Type) 객체는 Heap 영역에 저장되고 Stack 영역에 있는 변수가 객체의 주소값을 가지고있다.

원시타입 (Primitive Type) 전달
자바에서 원시 타입을 전달 할때 어떤 변화가 생기는지 보자

코드에서 보이다시피 변수 값을 바꾸는 함수를 호출해도, test()에서의 변수는 값이 바뀌지 않았다. 그럼 메모리에서는 어떻게 되는 것일까?

보이는 것과 같이 원시 타입을 전달 했을 때에는 함수 안에서 변수 값이 바뀌어도 외부에서는 바뀌지가 않는 것을 알수 있다.

참조타입 (Reference Type) 전달
자바에서 참조 타입을 전달 할때 어떤 변화가 생기는지 보자

코드에서 보이다시피 test()에서의 변수는 값이 바뀌었다. 이로써 call by reference 로 파라미터를 전달하였다고 생각이 들 수있겠지만, 실제로는 Reference 자체를 넘긴것이 아닌 주소 값을 전달하여 객체를 같이 참고 하는 것이다. 그림으로 보자
1. 처음 변수 선언 시

2. change(a, b) 호출 시점의 메모리 상태

3. change(a, b) 수행 직후 메모리 상태

4. test() 후 최종 메모리 상태

배움
자바에서는 참조타입을 전달할때도 주소값을 전달하여, call by reference 가 아닌 call by Value 가 적용된다.

참조:
링크1
링크2
링크3

profile
매일 매일 성장하자

0개의 댓글