Pass by value
- 모든 Primitive 타입의 인수
- CPP 포인터(
*), Reference(&)가 아닌 모든 타입의 인수- 클래스 타입의 객체를 넘길 경우 자동으로 Copy Constructor가 호출되어 새 객체를 생성하여 value를 넘기게 됨
- Copy Constructor를 정의하지 않은 경우, Default로 자동 생성됨 (Shallow Copy)
- 객체 자체는 새로 생성되더라도, 포인터 타입의 멤버 변수는 원본 객체의 것을 공유하게 됨
- ❤️ Safety (안전성): 원본 객체를 수정하지 못하는 것이 보장됨
- 💔 Overhead: 객체의 생성, 삭제가 Expensive
- Copy-On-Write: Write할 때만 새 메모리 할당, Read만 있을 경우 기존 객체 공유/참조
Pass by reference
📌 포인터/주소 값을 인수로 넘기는 방식
- CPP 포인터(
*), Reference(&) 타입의 파라미터- 차이점: Reference는 가리키는 메모리가 무조건 같은 타입의 실제 객체, C++ Style
NULL아님 보장 ➡ Safety (안전성)- 다른 타입을 가리킬 수 없음
↔ 포인터, 어느 타입의 값이든 가리킬 수 있음
- 💔 원본이 수정될 위험 존재
함수명(타입 const 변수명):변수명이 가리키는 원본이 수정되지 않음 보장 ➡ Safety (안전성)
↔함수명(const 타입 변수명):변수명에 저장된 주소값이 수정되지 않음
- 차이점: Reference는 가리키는 메모리가 무조건 같은 타입의 실제 객체, C++ Style
- Java Reference 변수를 파라미터로
- Reference 변수: Primitive 타입이 아닌 변수, 객체가 저장된 실제 Heap 공간의 주소를 저장하고 있음
- 참조하는 객체가 없을 경우
null(!=0)
- 참조하는 객체가 없을 경우
- 포인터 문법 없음 ➡ Security (보안성)
- Reference 변수: Primitive 타입이 아닌 변수, 객체가 저장된 실제 Heap 공간의 주소를 저장하고 있음