JVM (Java virtual machine)에 관하여 살펴보겠다.
Heap 영역
자바 객체와 배열이 생성되는 영역이다. 힙 영역에 생성된 객체와 배열은 JVM ㅅ택 영역의 변수나 다른 객체의 필드에서 참조한다. 만약 참조 값이 없다면 쓰레기로 취급하고 JVM은 GC를 이용하여 객체를 힙 영역에서 제거한다.
Stack 영역
각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. 추가적으로 스레드를 생성하지 않았다면 main 스레드 하나만 존재하므로 JVM 스택 역시 하나이다. JVM 스택은 메서드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메서드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다. 예외 발생 시 printStackTrace()는 메서드를 보여주는 Stack Trace의 각 라인은 하나의 프레임을 표현한다.
자바는 코드 실행흐름에 따라 스택 영역에 메모리를 할당하는데, 기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만 참조 타입 변수는 값이 아니라 힙 역역이나 메서드 영역의 객체 주소를 가진다.
Null / NullPointerException
위에서 언급했듯 참조타입 변수는 힙 영역의 객체를 참조해야 한다. 하지만 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다. Null 값 역시 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다. 그런데 이러한 참조 타입 변수를 잘못 사용하면 에러가 발생하는데 그 에러의 이름이 바로 NullPointerException이다. 예를 들어, 참조 타입 변수가 null을 가지고 있을 경우 참조 타입 변수는 사용할 수 없다. 참조 타입 변수를 사용하는 것은 곧 객체를 사용하는 것을 의미하는데, 참조할 객체가 없으므로 사용할 수가 없는 것이다.
아래의 코드를 보자.
Int[] arr = null;
arr[0] = 5;
위의 코드에서 arr은 배열 타입이므로 참조 타입 변수이다. 그래서 힙 영역의 특정 객체를 참조하지 않고 null 만으로도 초기화가 가능하다. 하지만 이 상태에서 arr[0]에 5라는 값을 저장하려고 하면 NullPointException에러가 발생한다. 왜냐하면 arr 변수가 참조하는 배열 객체가 없기 때문이다.
논리적으로 생각하면 아주 간단한 에러사항이지만, 긴 코드를 작성하다 보면 손쉽게 놓칠 수 있는 에러가 바로 NullPointerException 에러이다. 이 에러는 디버깅하기가 어려우므로 그때그때 잘 확인하는 습관이 필요하다.
'Language > Java' 카테고리의 다른 글
[Java] syncronized: multi-thread 환경에서 동기화 문제를 해결하는 키워드 (0) | 2020.06.22 |
---|---|
[Java] Lombok 사용하기 (0) | 2019.11.15 |
[Java] JVM 가상머신과 Java Language의 이식성, 호환성 관계 (0) | 2019.11.10 |
[Java] Garbage Collector란? (0) | 2019.11.10 |
[Java] JSP와 Servlet이란? (0) | 2019.10.13 |