참조타입 변수에서 null과 NullPointerException을 따로 분리해서 작성해두는게 좋을 것 같아 작성한다.
참조 타입 변수
- 메모리 번지를 저장하고 있지 않은 상태라는 의미로 null값을 가질 수 있다.
- null을 초기값으로 사용할 경우, 스택 영역에 저장되며, null을 값으로 저장한다.
null : 아무 의미 없는 값, 정해진 형태가 없는 값이다.
*기본 타입 변수에서는 사용할 수 없다. (=기본타입은 자료형에 맞는 값(=형태)가 정해져 있다.)
메모리 번지를 저장하는 것이 아니라 null을 저장하기 때문에 ==과 !=연산으로 null여부를 판단 할 수 있다.
Integer A = null;
if (A == null) {
System.out.println("true");
}
//결과
//true
참조타입 변수를 사용하면서 가장 많이 보게 되는 오류 중 하나가 NullPointerException이다.
- 사용하려는 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려고 할 때 발생하는 예외이다.
아래의 경우는 변수가 참조하는 String 객체가 없기 때문에 문자열의 길이를 구할 수 없어 발생한다.
String str = null;
System.out.println(str); //null 출력
System.out.println("문자길이: "+str.length()); //NullPointerException 발생
배열의 경우도 마찬가지이다. arr 변수가 참조하는 배열 객체가 없기 때문에 저장할 메모리 번지를 찾을 수 없다.(=저장할 수 없다.)
int[] arr = null;
arr[0] = 1; //NullPointerException 발생
프로그램 실행 중에 NullPointerException이 발생할 경우, 변수를 찾아 객체를 참조할 수 있도록 수정한다.
아래와 같이 메모리 번지를 변경한 경우 즉, 새로운 객체를 참조하도록 바꾸면 그전에 있던 객체는 어떻게 될까?
String name = "홍길동";
name = "초이사";
"홍길동"에 해당하는 String 객체는 어떤 변수에서도 참조하지 않는 값이 된다. 힙 영역에 존재는 하지만 메모리 번지는 모르게 되기 때문이다.
자바는 이런 객체를 쓰레기로 생각하고 JVM의 가비지 컬렉터를 실행해 자동으로 제거한다. 즉, 개발자가 직접 제거하는 코드를 작성할 필요는 없다.
가비지 컬렉터가 주기적으로 메모리 누수를 방지하기 위해 유효하지 않은 메모리 영역을 제거하는 과정을 가비지 컬렉션이라고 한다.
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 문자열(String) 타입이란? (feat. 비교, 길이) (0) | 2023.01.04 |
---|---|
[JAVA(자바)] JVM 구조와 메모리 영역 (0) | 2023.01.03 |
[JAVA(자바)] 기본타입과 참조타입 그리고 ==, != 연산 (0) | 2023.01.03 |
[JAVA(자바)] int, Integer차이와 Integer 비교시 == 아닌 equals() 사용하는 이유 (0) | 2022.12.31 |
[JAVA(자바)] The method sort(int[]) in the type Arrays is not applicable for the arguments 에러 해결 방법 (0) | 2022.12.27 |
댓글