본문 바로가기

Study/JAVA

[JAVA] Call by Value & Call by Reference

Call by value & Call by reference

Call by value

값에 의한 호출

함수가 호출될 때 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성된다. (종료시 반환)

Call by value 호출 방식은 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달한다.

이 때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value속성을 가진다.

따라서, 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경되지 않는다.

Call by reference

참조에 의한 호출

함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다.

함수 안에서 인자 값이 변경되면, 인자로 전달된 객체의 값도 변경된다.


자바의 경우, 항상 Call by value로 값을 전달한다.

C/C++과 같이 변수의 주소값을 가져올 방법이 없다. 그러니 주소값을 넘기는 방식도 존재하지 않는다.

자바에서는 Call by value 방식을 수행할 때, 값을 넘겨받은 메소드에서 인자 값을 복사하여 새로운 지역변수에 저장한다. 따라서 변수의 값이 변경되지 않았던 것이다.

하지만 객체를 인자로 넣어준다면 값이 변하게 된다.

이렇게 바뀌는 이유는 참조타입의 변수는 Heap Memory영역에 생성된 객체의 주소값을 참조하기 때문이다.

따라서 위의 코드에서 객체의 값이 변하게 된 이유는 메인메소드 내의 obj객체도 Heap메모리 영역에 있는 객체의 주소값을 참조하고 있고 test메소드에 넘겨준 인자값도 객체의 주소값이기 때문에 결국 객체의 주소값을 통해 값을 변경하였으므로 변하게 된 것이다.

하지만 만약 test메소드 내에서 새로운 객체(new)를 할당하게 된다면?

이와 같은 경우엔 test메소드에서 새로운 객체를 할당하였으므로 Heap 영역에 새로운 객체가 생성된다.

따라서 메인메소드에 있는 obj 객체는 값이 변화가 없으므로 변하지 않는다.

배열도 마찬가지로 자바의 참조변수이므로 같은 결과를 갖는다.

인자의 주소에 접근해 값을 변경하므로 변경된 값이 출력된다.

test메소드에서 새로운 참조변수를 생성하므로 기존 배열이 변경되지 않는다.

'Study > JAVA' 카테고리의 다른 글

[JAVA] Serialization  (0) 2022.06.16
[JAVA] Wrapper Class  (0) 2022.01.05