이론 공부

Java의 Call By Value, Call By Reference

Yuco 2023. 3. 28. 23:19

 

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 에서의 파라미터 전달 방법

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

 

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

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

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

 

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

- 원시 타입은 Stack 영역에 위치하며, 메서드 호출 시 넘겨받는 파라미터들도 원시 타입이라면 Stack 영역에 새롭게 생성됨

 

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

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

- 참조 타입 전달 시 Reference 자체를 전달하는 게 아니라 주소 값만 전달해주고, 새로 생긴 변수들이 주소 값을 보고 객체를 같이 참조함 (Stack 영역의 객체 새롭게 생성됨, 같은 Heap 영역의 객체 참조

 

4. Conclusion

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

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

 

 

'이론 공부' 카테고리의 다른 글

SOLID 원칙  (0) 2023.03.29
기타 개념 정리  (0) 2023.03.29
캐시 (Cache) / 캐싱 (Caching)  (0) 2023.03.28
AWS, Docker 개념  (0) 2023.03.28
RESTful API  (0) 2023.03.28