<메모리구조>
method 메소드영역 | stack 영역 | heap 영역
(=class영역, 데이터영역, ...)
1) method 영역
- 클래스와 메서드가 위치
static 멤버
2) stack 영역
- 기본 자료형(byte, short, int, long, float, double, boolean, char)이든
참조 자료형이든 상관없이 "지역변수"가 위치하는 영역
- 지역변수는 반드시 개발자가 직접 초기화를 시켜야 한다.
3) heap 영역
- 객체가 위치하는 영역
- 참조 자료형 변수가 가리키는 실제 데이터가 있는 공간
- 변수를 강제(자동으로) 초기화 시킴
int : 0, long : 0L, florat : 0.0f, double : 0.0, 참조자료형 : null
* 객체의 위치를 참조 변수에 저장하는 이유
new 키워드 이용해 객체를 생성하면 자바 가상 머신(JVM)은 힙 메모리 내에
비어 있는 공간을 찾아 그 공간에 객체를 생성
힙 메모리의 빈 공간은 그때 그때 다르므로 객체가 생성될 때마다 다른 위치에 저장됨
따라서 자바 가상 머신(JVM)이 생성한 객체의 위치를 반드시 알아야 개발자가 해당 객체를
사용할 수 있음.
ex) heap이라는 옆 강의실 사물함에 물건을 넣어 놓고, stack이라는 내 강의실에서
찾아갈 수 있게 하기 위해서 사용한다.
* new 키워드
- heap메모리에 넣어라 라는 의미
- jvm이 비어 있는 공간에 객체를 생성해줌
- 어느 공간에 넣었는지 알 수 없기 때문에 jvm은 객체의 위치 정보를 리턴해 주어야 하고
그 리턴된 값을 참조변수에 저장
* 스택메모리와 힙메모리 초기화
- 스택 메모리에 위치하고 있는 참조 자료형 변수의 빈 공간을 초기화 할 때는
null값을 사용할 수 있다.
- null값은 힙 메모리에 위치(주소, 번지)를 가리키고 있지 않다는 의미
즉, 연결된 실제 데이터가 없다는 것을 의미
- 스택 메모리 공간은 값을 초기화 하지 않으면 빈 공간으로 존재, 따라서 해당 변수를 출력하면 오류
- 힙 메모리는 어떤 상황에서도 빈 공간이 존재하지 않음
값을 주지 않으면 컴파일러가 값을 강제로 초기화
힙 메모리 영역은 미완성된 것은 올릴 수가 없다.