[Java] Null 과 NullPointerException

SUNNY_KIM·2024년 1월 5일
0
post-thumbnail

null

null 은 값이 존재하지 않는, 없다는 뜻이다.

참조형 변수에는 항상 객체가 있는 위치를 가리키는 참조값이 들어간다. 그런데 아직 가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶다면 어떻게 해야할까?
참조형 변수에서 아직 가리키는 대상이 없다면 null 이라는 특별한 값을 넣어둘 수 있다.


null 값 할당

package ref;

public class Data {
	int value;
}
package ref;

public class NullMain1 {
	public static void main(String[] args) {
		Data data = null;
		System.out.println("1. data = " + data);
		data = new Data();
		System.out.println("2. data = " + data);
		data = null;
		System.out.println("3. data = " + data);
	}
}

실행결과

1. data = null
2. data = ref.Data@x001
3. data = null

Data 타입을 받을 수 있는 참조형 변수 data 를 만들었다. 그리고 여기에 null 값을 할당했다.
따라서 data 변수에는 아직 가리키는 객체가 없다는 뜻이다.

이후에 새로운 Data 객체를 생성해서 그 참조값을 data 변수에 할당했다.
이제 data 변수가 참조할 객체가 존재한다.

마지막에는 data 에 다시 null 값을 할당했다. 이렇게 하면 data 변수는 앞서 만든 Data 인스턴스를 더는 참조하지 않는다.


GC - 그럼 아무도 참조하지 않는 인스턴스는 어디로 갈까?
C와 같은 과거 프로그래밍 언어는 개발자가 직접 명령어를 사용해서 인스턴스를 메모리에서 제거해야 했다. 만약 실수로 인스턴스 삭제를 누락하면 메모리에 사용하지 않는 객체가 가득해져서 메모리 부족 오류가 발생하게 된다.
자바는 이런 과정을 자동으로 처리해준다. 아무도 참조하지 않는 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 더 이상 사용하지 않는 인스턴스라 판단하고 해당 인스턴스를 자동으로 메모리에서 제거해준다.
객체는 해당 객체를 참조하는 곳이 있으면, JVM이 종료할 때 까지 계속 생존한다. 그런데 중간에 해당 객체를 참조하는
곳이 모두 사라지면 그때 JVM은 필요 없는 객체로 판단다고 GC(가비지 컬렉션)를 사용해서 제거한다.



NullPointerException

만약 참조값 없이 객체를 찾아가면 어떤 문제가 발생할까?
(ex. 택배를 보낼 때 주소지 없이 택배를 발송한 상황)

이 경우 NullPointerException 이라는 예외가 발생한다.
이름 그대로 null 을 가리키다(Pointer)인데, 이때 발생하는 예외(Exception)다.
null 은 없다는 뜻이므로 결국 주소가 없는 곳을 찾아갈 때 발생하는 예외이다.

객체를 참조할 때는 . (dot)을 사용한다. 이렇게 하면 참조값을 사용해서 해당 객체를 찾아갈 수 있다. 그런데 참조값이 null 이라면 값이 없다는 뜻이므로, 찾아갈 수 있는 객체(인스턴스)가 없다. NullPointerException 은 이처럼 null. (dot)을 찍었을 때 발생한다.

예제를 통해서 확인해보자.

package ref;

public class Data {
    int value;
}
package ref;
public class NullMain2 {
	public static void main(String[] args) {
		Data data = null;
		data.value = 10;  // NullPointerException 예외 발생
		System.out.println("data = " + data.value);
	}
}

실행결과

위 코드를 쉽게 해석 하자면

data.value = 10
null.value = 10    // data에는 null 값이 들어있다.

널 값에 '.'를 찍었다고 할 수 있다.
따라서 참조할 객체 인스턴스가 존재하지 않으므로 다음과 같이 java.lang.NullPointerException 이 발생하고, 프로그램이 종료된다.

꿀팁!!
NullPointerException 이 발생하면 null 값에 . (dot)을 찍었다고 생각하면 문제를 쉽게 찾을 수 있다.


참고

[인프런] 김영한의 실전 자바 - 기본편

profile
호기심이 많은 백엔드 개발자

0개의 댓글