본문 바로가기

프로그래밍언어/Java

[Java 기본] null

null


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

참조형 변수에서는 가리키는 대상이 없다면 null 값을 넣을 수 있다.

 

    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을 할당했다. 따라서 앞서 생성한 Data 인스턴스는 아무도 참조하지 않는다. 

        data = new Data();
        System.out.println("2. data = " + data);
        data = null;
        System.out.println("3. data = " + data);

인스턴트가 생성되었지만 이 주소값을 들고 있는 곳이 없는 것이다. 따라서 해당 인스턴스에 다시 접근할 방법이 없다. 

이 인스턴스는 메모리 용량만 차지할 뿐이다. 자바는 이렇게 아무도 참조하지 않는 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 더 이상 사용하지 않는 인스턴스라 판단하고 해당 인스턴스를 자동으로 메모리에서 제거한다. 

 

객체는 해당 객체를 참조하는 곳이 있으면 JVM이 종료할 때 까지 계속 생존한다. 그런데 중간에 해당 객체를 참조하는 곳이 모두 사라지면 그때 JVM은 필요 없는 객체로 판단하고 GC를 사용해서 제거한다. 

 

NullPointerException


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

    public static void main(String[] args) {
        Data data = null;
        data.value = 10;
    }

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.