CS/Java

Call By Value와 Call By Reference

MinCodeHub 2025. 10. 14. 14:24

Java는 기본적으로 모든 전달방식이 Call by Value입니다

자바의 Call by Value 동작 방식

 

자바의 데이터 타입은 다음과 같이 크게 두가지로 나누어집니다.

 

  • 원시타입(primitive type) - Numeric Type(byte, short, int,float, long, double, char), Boolean Type(boolean
  • 참조타입(reference type) - Class Type, Interface Type, Array Type, Enum Type, 기타 참조 타입(String 등)

메서드 파라미터로 원시 타입을 전달하는 것과 참조 타입을 전달하는 것에는 동작 방식에 차이가 있습니다.

원시 타입(primity type) 전달 방식 

 

행위 : add 함수를 통해  int타입의 변수 v에 1 더하기
결과 값 : 1

primitiveTest()의 v 변수와 add()의 num은 아예 연관없는 변수

 

자바에서 변수를 선언하면 기본적으로 Stack 메모리 영역에할당됩니다.

Stack 영역 내부에 primitiveTest()와 add()의 영역이 각각 나뉘어있고, 서로 다른 변수가 존재합니다.

그래서 num 값에 1을 더해도 v변수에는 영향이 없습니다.

 

 

참조 타입(reference type)전달 방식

변수는 Stack영역에 생성되지만, 객체는 Heap 영역에 위치하며

Stack영역에 있는 변수가 Heap영역에 있는 객체를 바라보고 있는 형태입니다.

 

변수의 참조(주소)값을 복사해서 전달해 referenceTest()역역과 add()영역의 변수들은 모두 동일한 객체의 주소(0x001)을 바라보고 있습니다.

add()에서 생긴 변수가 같은 주소 값을 참조하고 있기 때문에 값이 변경되었습니다.

 

"그렇다면 Call by Reference아닌가??"

 

자바의 참조와 Call by Reference의 참조는 다릅니다.

자바의 참조는 "객체가 힙에 저장된 위치를 가리키는 메모리 주소"입니다. (실제 객체에 대한 참조X, 접근하고 조작하는 방법)

Call by Reference는 참조 자체를 넘기기 때문에 새로운 객체를 할당하면 원본 변수도 영향을 받습니다.

 

전달받은 값을 새로운 객체로 변경해도 원본 변수는 변하지 않습니다.

따라서 참조 타입 역시 Call by Value 방식을 동작함을 보여줍니다.

newArr()가 종료되고 사용되지 않는 객체(0x002)는 Garbage Collector에 의해 수거될 것입니다.

 

결국 자바는 항상 Call by Value 방식으로 데이터를 전달하고,

핵심은 호출자 변수와 수신자 파라미터는 Stack영역 내에서 각각 독립적으로 존재하는 다른 변수라는 것입니다.


Q. Call By Value와 Call By Reference의 차이에 대해 설명해주세요.

Call By Value는 인자로 받은 값을 복사하여 처리하는 방식을 말합니다.

값을 복사하여 처리하기 때문에 원래의 값이 보존된다는 장점이 있고,

복사하기 때문에 메모리 사용량이 증가한다는 단점이 있습니다.

Call By Reference는 인자로 받은 값의 주소를 참조하여 직접 저장해 값에 영향을 주는 방식을 말합니다.

복사하지 않고 직접 참조하기 때문에 빠르다는 장점이 있고, 직접 참조를 하기에 원래의 값이 영향을 받는다는 단점이 있습니다.

 

Q. 그럼 Java에서 어느 부분이 call by value이고 어느 부분이 call by reference에 해당하나요?

Java는 기본적으로 모든 전달방식이 Call by Value입니다. 이는 즉, 값을 복사해서 전달한다는 의미입니다.

참조형의 경우 객체의 주소값을 전달하니까 Call by Reference가 아니냐고 생각할 수 있지만, 

주소값이라는 것이 실제로는 주소를 가리키는 참조값이고, 이 참조값을 전달할 때도 복사해서 전달하기 때문에 Call by Value입니다.

즉, 기본형은 값 자체를 복사하고, 참조형은 참조값을 복사한다고 볼 수 있습니다.

 

'CS > Java' 카테고리의 다른 글

자료형(기본 자료형, 참조 자료형, Wrapper Class, 박싱과 언박싱)  (0) 2025.10.15
Generic  (0) 2025.10.13