// 참조변수 : 프로그래밍에서 객체에 접근하고 다루기 위해 사용되는 변수로,
// '메모리 상의 객체를 가리키는 역할'을 함 (어딘가의 메모리를 가르킨다)
// 1. (참조타입, 기본타입에 상관없이) 모든 지역변수(=형광노랑)는 stack memory에 쌓인다!
// 2. 변수는 기본타입과 참조타입으로 나뉜다
--> 기본타입(int, double, boolean... 등등 8개) 이외에 모든 변수는 참조변수이다!
int a = 10; // 변수 a의 타입 : int
int[] arr = new int[5]; // 변수 arr의 타입 : ?
arr[0] = 10; // 이게 어떤걸 표현하는 문법일까?
System.out.println(arr[0]);
//arr = 10; ---> arr 자체도 변수이다. 변수면 값을 업데이트 할 수 있는데....
// RAM은 stack과 heap으로 나눠졌었지? (P0823, P5 참고)
// heap 메모리 : 프로그램이 실행 중에 동적으로 데이터를 할당하고 관리하는 영역으로,
주로 '객체와 변수를 저장'하는 데 사용됨
// 힙 메모리는 컴퓨터의 물리적인 RAM에 해당함
// ---> 프로그램이 힙 메모리를 과도하게 사용하거나 메모리 누수가 발생할 경우 시스템 성능에 부정적인 영향을 미칠 수 있음
// 모든 지역변수는 stack에 쌓인다. 나머지 모든경우(거의 99%)는 heap에 쌓인다.
// int[] arr = new int[5]; ---> new : 메모리를 생성한다. 이것은 heap 메모리에 쌓인다!
// ★★★ 참조변수 arr : heap메모리에있는 0xFF11번째(= heap메모리의 주소값)에 있는 메모리를 가져오는 포인터!!
// int[] arr = new int[5]; ---> new int[5]라는 heap메모리 & 주소값을 생성
// arr[0] = 10; ---> 참조변수의 []는 접근연산자라고 생각하면됨 (= 진짜 데이터는 heap메모리의 0번째 주소값에 들어있음)
// ★★★ arr(= 0xFF11)의 0번째를 []통해 접근한다.
// 참조변수에는 null이라는 값을 담을 수 있다
arr = null; // null : heap메모리에서 가져올 주소가 없음을 나타내는 것.
System.out.println(arr); // null출력됨
//a = null; // 기본타입에는 null값을 못넣겠찌?
// ★★★ 그래서! arr = null;을 수행하게되면 arr의 0xFF11이라는 주소값은 사라지는거임
arr[0] = 20; // null pointer exception
// --> arr이 heap 메모리의 0xFF11 주소값의 값을 가져오는 앤데,
// 주소값을 null로 없앴으니 가져오지 못하는거!