null
친구에게 책을 보내려고 합니다.
우체국 택배를 보내려고 할 때 책은 준비가 되었지만, 깜빡하고 친구에게 주소를 물어보지 못했습니다.
즉, 보낼 주소지가 아직 결정되지 않았습니다.
이 때, 보낼 주소지가 결정될 때 까지는 주소지를 비워두어야 할 것 입니다.
- 참조형 변수에는 항상 객체가 있는 위치를 가리키는 참조값이 들어갑니다.
- 그런데 아직 가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶을 경우에는 어떻게 해야할까요?
- 참조형 변수에서 아직 가리키는 대상이 없다면
null
이라는 특별한 값을 넣어둘 수 있습니다.-
null
은 값이 존재하지 않는, 없다는 뜻 입니다.
-
“코드를 통해서 null
값에 대해 알아봅시다.”
Data
package ref;
public class Data {
int value;
}
NullMain1
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@30f39991
3. data = null
Data data = null;
-
Data
타입을 받을 수 있는 참조형 변수data
를 만들었습니다.- 그리고 여기에
null
값을 할당했습니다.- 따라서
data
변수에는 아직 가리키는 객체가 없다는 뜻입니다.
- 따라서
- 그리고 여기에
data = new Data();
- 이후에 새로운
Data
객체를 생성해서 그 참조값을data
변수에 할당했습니다.- 이제
data
변수가 참조할 객체가 존재합니다.여기서 Data 인스턴스의 value 값은 0으로 초기화 되어있습니다.
- 이제
data = null;
- 마지막에는
data
에 다시null
값을 할당했습니다.- 이렇게 하면
data
변수는 앞서 만든Data
인스턴스를 더는 참조하지 않습니다.
- 이렇게 하면
“GC(Garbage Collection) - 아무도 참조하지 않는 인스턴스의 최후”
마지막에 data
에 null
을 할당했습니다.
따라서 앞서 생성한 x001
(sudo 참조값) Data
인스턴스를 더는 아무도 참조하지 않습니다.
이렇게 아무도 참조하지 않게 되면 x001
이라는 참조값을 다시 구할 방법이 없습니다.
따라서 해당 인스턴스에 다시 접근할 방법이 없습니다.
- 이렇게 아무도 참조하지 않는 인스턴스는 사용되지 않고 메모리 용량만 차지할 뿐입니다.
C와 같은 과거 프로그래밍 언어는 개발자가 직접 명령어를 사용해서 인스턴스를 메모리에서 제거해야 했습니다.
만약 실수로 인스턴스 삭제를 누락할 경우, 메모리에 사용하지 않는 객체가 가득해져서 메모리 부족 오류가 발생하게 됩니다.
“자바는 이런 과정을 자동으로 처리해줍니다.”
- 아무도 참조하지 않는 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 더 이상 사용하지 않는 인스턴스라 판단하고 해당 인스턴스를 자동으로 메모리에서 제거해줍니다.
“객체는 해당 객체를 참조하는 곳이 있으면, JVM이 종료할 때 까지 계속 생존합니다.”
- 그런데 중간에 해당 객체를 참조하는 곳이 모두 사라지면 그때 JVM은 필요 없는 객체로 판단하고 GC(가비지 컬렉션)를 사용해서 제거합니다.