Language/Java

객체와 메모리

kalza 2018. 8. 28. 10:07

1. 메모리에서 객체 생성(동적 생성)


객체는 new 연산자를 이용하여 생성하면 메모리에서 동적 생성된다. 

객체가 더 이상 필요 없게 되면(사용하지 않게되면) 가비지 컬렉터(Garbege Collector)에 의해서 제거 된다.




2. 레퍼런스


생성 객체의 주소를 변수에 저장하는것을 레퍼런스라고 한다.

객체의 주소가 담긴 변수를 통해 객체에 접근 할 수 있다.

실습을 통해 확인해본다.

먼저 'ObjectClass'라는 클래스를 만든다.

객체를 생성한후 주소값만 확인 하는 출력문을 작성할 것이므로 클래스만 만들어 놓은 상태에서 

main메서드를 갖는 'MainClass' 클래스를 만들고 ObjectClass객체를 3개 생성한다.

객체의 주소를 찍어본다.


 ObjectClass.java

  public class ObjectClass {


 }



 MainClass.java

  ObjectClass obj1 = new ObjectClass();

ObjectClass obj2 = new ObjectClass();

ObjectClass obj3 = new ObjectClass();


System.out.println("obj1의 주소 : " + obj1);

 System.out.println("obj2의 주소 : " + obj2);

 System.out.println("obj3의 주소 : " + obj3);



 결과

 obj1의 주소 : study4.ObjectClass@7852e922

 obj2의 주소 : study4.ObjectClass@4e25154f

 obj3의 주소 : study4.ObjectClass@70dea4e



같은 클래스에서 만들어진 객체라하더라도, 참조 변수에는 각각 다른 주소를 갖는다는것을 확인할 수 있다.




3. null과 Excpetion


레퍼런스에 null이 저장되면 객체의 연결이 끊기며, 더 이상 객체를 사용할 수 없다.

이 말은, 생성된 객체의 주소를 가리키는 참조변수가 null이 되면, 주소를 잃은 참조변수를 사용 할 수 없게 된다는 말이다.

'objectClass2'라는 클래스를 만들어 'getInfo' 메서드를 작성한 후 main 메서드에서 객체를 생성해본다.

객체를 통해 getInfo 메서드를 호출하면 getInfo 메서드가 된다.

그럼 참조변수에 null을 대입해보면 어떤 결과가 나올지 확인해보자.


 ObjectClass2.java

 public class ObjectClass2 {

public void getInfo() {

System.out.println("-- getInfo() --");

}

 }



 MainClass2.java

 ObjectClass2 obj1 = new ObjectClass2();

System.out.println("obj1의 주소 : " + obj1);

obj1.getInfo();

obj1 = null;

System.out.println("obj1의 주소 : " + obj1);

obj1.getInfo();

 }



 결과

 obj1의 주소 : study4.ObjectClass2@7852e922

 Exception in thread "main" -- getInfo() --

 obj1의 주소 : null

 java.lang.NullPointerException

  at study4.MainClass2.main(MainClass2.java:17)