훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com
레퍼런스 변수
자바에서 레퍼런스 변수는 primitive 자료형(기본 자료형 8개) 외에 다른 모든 것을 가리키는 변수를 의미합니다.
자바는 객체지향 언어이기 때문에, 사실상 레퍼런스 변수를 가장 많이 사용할 것입니다.
이런 레퍼런스 변수는 다음과 같은 구조를 갖습니다.
객체(Object)가 new를 통해 할당될 때 힙 메모리에 자신만의 영역을 갖게 됩니다.
위 그림에서 int []는 기본 자료형이 아닌, 레퍼런스 자료형입니다. (배열 자료형)
new로 할당한 레퍼런스 자료형은 '힙 영역'에 할당됩니다.
또한 할당과 동시에 모두 0으로 초기화가 됩니다.
또한 배열 자체의 연속된 공간 외에도, 기타 정보들이 들어가는 자리가 더 할당이 됩니다.
그렇다면 intArr 변수는 스택 메모리에 할당되었을까요 아니면 힙 메모리에 할당되었을까요?
정답은 모른다입니다.
프로그래머가 함수 내부에 할당하면 스택 영역에 할당되는 것이고,
함수 외, 클래스 내에 할당하면 힙 영역에 할당되는 것입니다. (클래스가 new로 생성 시 힙에 할당되기 때문에)
public class MyClass {
int[] heapArr;
public static void main(String[] args) {
int[] stackArr;
}
}
위의 heapArr은 클래스 내, 함수 외 이므로 힙 영역에
stackArr은 함수 내 영역이므로 스택에 메모리가 할당되는 것입니다.
스택과 힙 메모리 할당 시 차이점
스택과 힙의 큰 차이점 중 하나는, 스택은 선언 시 0(null)으로 초기화되지 않는다는 점입니다.
public static void main(String[] args) {
int[] stackArr;
stackArr[1] = 10;
}
그래서 위와 같은 코드는 컴파일 시 에러를 발생시킵니다.
스택의 레퍼런스 변수는 자동으로 null로 초기화가 되지 않기 때문입니다.
public class MyClass {
public int[] heapArr;
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.heapArr[3] = 10;
}
}
반면 이렇게 힙 영역에 할당된 변수를 초기화하지 않고 사용하게 되면,
NullPointerException이 발생하게 됩니다. (0으로 초기화는 되었으므로)
정리하면
초기화되지 않은 레퍼런스를 참조했을 때의 발생 경우입니다
.
'Java' 카테고리의 다른 글
예외 처리 (0) | 2021.04.06 |
---|---|
자바 배열과 메모리 (0) | 2021.03.30 |
Scanner로 키보드 입력 받기 (0) | 2021.03.23 |
타입 변환 (0) | 2021.03.23 |
상수 (0) | 2021.03.23 |