객체와 메모리
- 메모리에서 객체가 어떻게 생성되고 이용되는지 알아야 객체지향 프로그래밍에서 객체를 효과적으로 다룰 수 있다!
메모리에서 객체 생성(동적 생성)
- 객체는 메모리에서 동적으로 생성, 객체가 더이상 필요 없게 되면 GC(Gabage Colletor)에 의해서 제거
- 클래스를 이용해 객체를 생성(*New)
- 예) ChildClass child
(레퍼런스)
= new ChildClass();(생성자)
- 레퍼런스는 메모리에 생성된 메모리의 주소를 담고 있음
- 즉, child라는 레퍼런스에 데이터가 들어있는 것이 아니라 주소값만 있음
- 인자가 없는 객체(레퍼런스와 연결이 끊어진 객체)
- GC가 메모리를 돌면서 회수, 메모리에서 삭제
- 메모리 사용 가능
레퍼런스(가리킨다)
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);
- 동일한 클래스로 객체를 3개 생성
- 이것들은 동일한 메모리 공간에 생성된 것이 아닌
- 각각의 메모리 공간에 생성
- 즉, 각각의 메모리 주소가 다름
- 클래스가 같다고 해서 동일한 객체가 아니다!
자료형이 같아도 다른 객체
- 자료형이 같아도 다른 공간에 존재하는 객체는 다른 객체이다!
- 위의 코드에서 각 객체들은 다 다른객체이다!
null과 NullPointerException
- 레퍼런스에 null이 저장되면 객체의 연결이 끊기며, 더이상 객체를 이용할 수 없다.
- 레퍼런스가 null로 바뀌었는데 객체에 레퍼런스를 통해 접근하려 하면 NullPointerException 발생
ObjectClass obj1 = new ObjectClass();
System.out.println("레퍼런스 obj1 --->" + obj1);
obj1.getInfo();
obj1 = null;
System.out.println(obj1);
obj1.getInfo();
- 단, 이경우 레퍼런스가 메모리에서 사라지는 것은 아님