본문 바로가기

java(자바)

[java(자바)] Call by Value와 Call by Reference의 차이 _디버깅의 눈물

Call by Value와 Call by Reference는 메서드를 호출할 때 파라미터를 전달하는 2가지 방식을 말합니다.

 

 

Call by Value(값에 의한 호출)

 

-메서드를 호출할 때 '값'을 전달하는 방식입니다.

 

-메서드에 파라미터로 전달되는 값을 변경하더라도, 원본 값은 변경되지 않습니다.

 

-자바의 메모리는 크게 스택(Stack)과 힙(Heap)으로 나뉘는데, 메서드 호출 시에는 스택 영역에 메서드의 지역 변수와 인자 등이 저장됩니다. 이때 인자로 전달되는 값은 기존 인자의 값을 복사한 새로운 인자 값이 스택에 저장된 것입니다. 이 값은 메서드 내에서 지역적으로 사용됩니다. 메서드가 종료되면 해당 메모리 영역이 스택에서 제거되고, 호출자의 변수에는 아무런 영향이 없습니다.

 

-Call by Value에서는 원본 데이터가 변경될 가능성은 없지만, 인자를 넘길 때마다 메모리 공간을 할당해야 하기 때문에 추가 메모리 공간이 발생합니다. 

 

 

 

Call by Reference(참조에 의한 호출)

 

-메서드를 호출할 때 '참조 주소'를 전달하는 방식입니다.

 

-메서드에 파라미터로 전달되는 값을 변경하면, 원본 값도 변경됩니다.

 

-객체 자체의 값은 Heap 메모리 영역에 생성되고, 객체의 주소값을 가지고 있는 참조 변수는 Stack 영역에 생성됩니다. 자바에서는 객체를 직접 다루는 것이 아니라, 객체를 가리키는 참조 변수를 통해 객체에 접근합니다.

 

-'메서드 호출자의 변수가 참조하는 객체의 주소값'이 메서드에 복사되어 전달되기 때문에, 호출자의 변수와 메서드의 파라미터는 완전 동일 변수입니다. 

 

-Call by Reference에서는 추가 메모리 할당 문제는 없지만, 원본 데이터가 변경될 수 있다는 위험이 있습니다. 

 

 

 

Java에서는 기본적으로 Call by Value

 

자바에서는 기본적으로 'Call by Value' 방식으로 동작합니다. 하지만 객체를 인자로 전달할 경우에는 'Call by Reference'와 비슷한 동작을 보입니다. 객체 변수는 해당 객체를 가리키는 참조값을 가지고 있으며, 이 참조값이 메서드로 복사되어 전달됩니다. 따라서 메서드 내에서 객체의 상태를 변경하면, 호출한 측에서도 변경된 객체의 상태를 확인할 수 있습니다.

 

하지만 이것은 객체가 직접 전달되는 것이 아니라, 객체의 참조값이 전달된 것이므로, 엄밀히 말해서 자바는 'Call by Value with Reference' 방식으로 작동된다고 볼 수 있습니다.