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 |