본문 바로가기

Java/문법

[Java] Call by Value, Call by Reference

[1] Call by Value, Call by Reference

- 프로그래밍 언어에서 함수나 메서드를 호출할 때 파라미터를 전달하는 두 가지의 방식

 

1. Call by Value

- Call by Value 는 메서드를 호출할 때 값을 넘겨주기 때문에 Pass by Value 라고도 부르기도 함

- 메서드를 호출하는 호출자 (Caller) 의 변수와 호출 당하는 수신자 (Callee) 의 파라미터는 복사된 서로 다른 변수

- 값만을 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없음

 

2. Call by Reference

- Call by Reference 는 참조 (주소) 를 직접 전달하며 Pass By Reference 라고 부르기도 함

- 참조를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수

- 메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 반영됨

 

[2] Java 에서의 Call by Value, Call by Reference

** Java 는 오직 Call by Value 로만 동작

 

1. JVM 메모리에 변수가 저장되는 위치 및 파라미터 전달 

- Java 에서 변수를 선언하면 Stack 영역에 할당됨

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

 

 

1) 원시 타입 (Primitive Type) 전달

- 원시 타입은 Stack 영역에 위치하며, 메서드 호출 시 넘겨받는 파라미터들도 원시 타입이라면 Stack 영역에 새롭게 생성됨 (서로 다른 변수이기 때문에)

- 원시 타입은 정수, 실수, 문자, 논리 리터럴 등 실제 데이터 값을 저장하는 타입 (boolean, char, byte, int, short, long, float, double)

 

2) 참조 타입 (Reference Type) 전달

- 참조 타입은 원시 타입과는 다르게, 변수 자체는 Stack 영역에 생성되지만 실제 객체는 Heap 영역에 위치하며, Stack 에 있는 변수가 Heap 에 있는 객체를 바라보고 있는 형태

- 참조 타입 전달 시 Reference 자체를 전달하는 게 아니라 주소 값만 전달해주고, 새로 생긴 변수들이 주소 값을 보고 객체를 같이 참조함 (Stack 영역의 객체 새롭게 생성되지만, 같은 Heap 영역의 객체를 참조하기 때문에 완전히 동일한 변수라고 할 수 있음)

 

2. Conclusion

"결국 주소값을 넘기는 게 결국 Call by Reference 아닌가?" 라는 생각을 할 수 있지만, Call by Reference 는 참조 자체를 넘기기 때문에 새로운 객체를 할당하면 원본 변수도 영향을 받는 것

 

** 호출자 변수와 수신자 파라미터는 Stack 영역 내에서 각각 존재하는 다른 변수라는 게 핵심

'Java > 문법' 카테고리의 다른 글

[Java] 기초 문법  (0) 2024.07.18
[Java] 자바 기초  (0) 2024.07.18
[Java] 비동기 프로그래밍  (0) 2024.07.18