[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 |