Java

[인프런] null과 NullPointerException

sejin2 2024. 5. 20. 23:09

null

참조형 변수에는 항상 객체가 있는 위치를 가리키는 참조값이 들어간다. 그런데 아직 가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶으면 null이라는 특별한 값을 넣어둘 수 있다.
null은 값이 존재하지 않는, 없다는 뜻이다. 

public class Data {
    int value;
}


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);
    }
}

GC - 아무도 참조하지 않는 인스턴스
data에 null을 할당하면 해당 인스턴스는 더는 아무도 참조하지 않는다. ( 메모리 어딘가에 둥둥 떠있음 )
이렇게 아무도 참조하지 않게 되면 해당 인스턴스에는 다시 접근할 방법이 없고, 메모리의 용량만 차지하게 된다.
따라서 메모리에서 제거해 주어야 하는데, 자바는 이런 과정을 자동으로 처리해준다. 
아무도 참조하지 않는 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 더이상 사용하지 않는 인스턴스라고 판단하고 해당 인스턴스를 자동으로 메모리에서 제거해준다.
객체는 해당 객체를 참조하는 곳이 있으면, JVM이 종료할 때까지 계속 생존한다. 그런데 중간에 해당 객체를 참조하는 곳이 모두 사라지면 그 때 JVM은 필요 없는 객체로 판단하고 GC를 사용해서 제거한다. 

 

NullPointerException

참조값 없이 객체를 찾아가면 NullPointerException이라는 예외가 발생하는데, 이는 개발자를 가장 많이 괴롭히는 예외이다. NullPointerException은 이름 그대로 null을 가리키다인데, 이때 발생하는 예외이다.
null은 없다는 뜻이므로 결국 주소가 없는 곳을 찾아갈 때 발생하는 예외이다. 

객체를 참조할 때는 .을 사용하여 참조값을 사용해 해당 객체를 찾아갈 수 있는데, 참조값이 null이면 값이 없다는 뜻으로 결국 주소가 없는 곳을 찾아갈 때 발생하는 예외이다. 

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

참조할 객체 인스턴스가 존재하지 않으므로 위와 같은 예외가 발생하고 프로그램이 종료가 된다.

멤버 변수와 Null

public class BigData {
    Data data; // 참조형이 초기값 Null
    int count; // 초기값 0
}

public class NullMain3 {
    public static void main(String[] args) {
        BigData bigData = new BigData();
        System.out.println("bigData.count = " + bigData.count);
        System.out.println("bigData.data = " + bigData.data);

        // NullPointerException
        System.out.println("bigData.data.value" + bigData.data.value);
    }
}

BigData를 생성하면 인스턴스가 생성된다. 이때 BigData 인스턴스의 멤버 변수에 초기화가 일어나는데, BigData의 data 멤버 변수는 참조형이므로 null로 초기화가 된다. count 멤버 변수는 숫자이므로 0으로 초기화가 된다.
- bigData.data.value를 출력하면 data의 값이 null이므로 null에 .을 찍게 되고 참조할 곳이 없으므로 NullPointerException예외가 발생한다. 

이를 해결하기 위해서는 참조할 수 있는 값을 주면 된다.

public class NullMain4 {
    public static void main(String[] args) {
        BigData bigData = new BigData();
        bigData.data = new Data();
        System.out.println("bigData.count = " + bigData.count);
        System.out.println("bigData.data = " + bigData.data);
        
        System.out.println("bigData.data.value" + bigData.data.value);
    }
}

 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] 클래스와 메서드  (0) 2024.05.21
[인프런] 절차 지향 프로그래밍  (0) 2024.05.21
[인프런] 변수와 초기화  (0) 2024.05.20
[인프런] 기본형과 참조형  (0) 2024.05.20
[인프런] 배열  (0) 2024.05.20