Java - 객체와 메모리

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


객체와 메모리

객체 지향 프로그래밍에서는 객체를 효율적으로 사용하기 위해 메모리에서 객체가 어떻게 생성되고 사용되는 지가 중요하다.

객체의 동적생성

객체는 메모리에서 동적으로 생성되며, 객체가 더이상 필요없게 되면 GC에 의해 제거된다.

  • 개발자는 객체 생성을 위해 class를 만들고 new라는 키워드를 통해 여러개의 객체(obj)를 생성
    • 일반적으로 ChildClass child = new ChildClass(); 로 객체를 생성했다면
    • 이때 child가 레퍼런스이며 이 레퍼런스에는 메모리에 생성된 객체의 주소가 담긴다.
  • 즉, new라는 키워드를 통해 객체를 생성하고 =대입/할당 연산자를 통해 레퍼런스의 주소를 담고있다.
  • 이렇게 객체를 가리키고 있던 레퍼런스는 객체가 필요없어지는 경우 그 관계가 끊어진다.
  • 끊어진 관계로 인해 객체는 더이상 레퍼런스를 가지고 있지 않으며 그때의 객체는 임자없는 객체가 된다.
  • 이때 GC는 해당 객체가 어떠한 레퍼런스와도 관계가 없다고 판단하여 해당 메모리를 정리한다. (메모리 회수)
    • 회수된 메모리를 통해 객체는 메모리에서 지워지며 이를 통해 메모리를 효율적으로 관리할 수 있게 된다.

즉 개발자는 클래스로 객체를 생성하고 해당 객체가 필요 없어질 경우 GC가 알아서 쓰고 남은 객체를 회수해 효율적으로 메모리를 관리한다.

레퍼런스

객체를 생성하고 그 객체를 가리키고 있는 주소값을 담고 있는 변수 상자

같은 클래스에서 객체를 생성했다고 해서 동일한 레퍼런스를 지니고 있는 객체가 아니며, 각 객체는 메모리상에서 서로 다른 공간에 존재하고 있다.

즉, 그 객체가 가지고 있는 속성값(데이터)는 다르다.

NULL과 NULLPointException

메모리에 존재하는 레퍼런스에 null이 저장되면 객체와의 연결이 끊기며, 해당 객체는 더이상 사용이 불가능하다.

클래스로부터 생성한 객체가 더이상 필요없어질 경우 해당 객체에 null값을 저장할 수 있다.

해당 객체로부터 null이 출력되면 이제 그 객체와 레퍼런스와의 관계가 끊긴것을 의미하며 따라서 다시 해당 메서드를 호출할 경우 Exception이 발생하게 된다.

이때 해당 에러는 NULLPointException이며 그 내용은 해당 객체가 빈곳을 가리키고 있다.는 의미를 가진다.

따라서 객체와 레퍼런스와의 관계를 null로 끊어버리는 경우 이전에 연결했던 객체와 연결할 방법은 사라지게 된다.

그러나 null을 입력했다고해서 메모리 상에서 레퍼런스가 사라지는건 아니다.

해당 레퍼런스에 new 키워드를 통해 객체를 생성한 뒤 대입 연산자를 통해 해당 레퍼런스로 다시 연결이 가능하다.

null값을 입력했다는 것은 해당 객체와 레퍼런스 사이의 관계를 끊어내는 것이지, 해당 레퍼런스 자체를 삭제시키는 것을 의미하는 건 아니다.