Java, null
제품을 만들어 소비자에게 제공해주기 위해 택배를 이용하였다. 하지만 소비자의 주소를 받지 않아 운송장의 주소지를 비워두고 있었다.
만약, 주소지가 없는 택배를 보내게 되면 어떻게 될까?
자바에서는 위와 같은 현상을 경험하게 될 경우 프로그램을 바로 강제 종료된다.
자바 참조형 변수에는 항상 객체가 있는 참조 주소값이 들어가야 한다.
가리키는 주소가 없는 경우 자바가 강제 종료 되지 않도록 null
이라는 값을 할당할 수 있다. null
은 값이 존재 하지 않다. 없다는 뜻을 갖고 있다.
null 사용 코드
public static void main(String[] args) {
Point p = null;
System.out.println("1. p = " + p);
p = new Point();
System.out.println("2. p = " + p);
p = null;
System.out.println("3. p = " + p);
}
출력 결과
1. p = null
2. p = Main$Point@4e50df2e
3. p = null
GC - Garbage Collection
가비지 콜렉션은 참조되지 않는 인스턴스들을 청소해주는 기능을 제공해준다.
앞서 사용한 코드에서 p = new Point(); 변수 p를 인스턴스로 선언하고, 이후 p = null ; 참조되지 않는 null 값으로 할당하였다. 이럴 때 new Point(); 선언한 얘는 아무도 참조되지 않는 상태가 되고, 메모리를 차지한 상태로 참조할 수 있는 방법도 없다.
c 에서는 개발자가 free() 명령어로 인스턴스를 메모리에서 직접 제거해주어야 했다. 실무에서 인스턴스 삭제를 누락하게 되면 메모리 사용률이 높아져 out of memory
현상으로 크래쉬가 발생한다.
자바는 아무도 참조되지 않는 인스턴스를 발견하면 JVM의 가비지 콜렉션이 더 이상 사용하지 않는 인스턴스를 메모리에서 삭제해주도록 한다.
물론, 참조 되고 있는 객체는 JVM 이 종료될 때 까지 생존한다. 중간에 참조하는 것이 모두 사라져야 JVM이 필요없는 객체에게 가비지 콜렉션을 이용해서 삭제한다.
메모리를 직접 해제하는 경우 명령어 수행이 많아지고 성능 이슈가 발생될 수 있다. 이럴 때는 JVM의 가비지 콜렉션을 이용해 사용하지 않는 객체나 인스턴스를 모아두고 한번에 삭제하는 것이 성능이 오히려 좋은 경우가 있다.