전 시간에 객체를 클래스로 부터 New를 통해 생성을 하게 되면, Instance가 생성되고

Heap이라는 Memory에 들어가게 되는데, Instance와 Heap Memory가 어떻게 만들어 지는 지, 이 Heap Memory가 어떻게 관리 되는지 살펴보자.

 

 

인스턴스 (Instance)


  • 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
  • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 된다. 가령 학생 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 된다.

위는 지난 번에 만들어 본 코드인데, "studentLee", "studentKim" 이라는 두 개의

Instance가 있는데, 각각의 인스턴스에 studentID,studentName,address를 각각 다르게 변수를 할당 했다. 이 것이 가능한 이유는 서로 다른 메모리에 위치 하고 있기 때문이다. 만약 같은 메모리를 쓰고 있다고 가정한다면 다른 이름을 줄 수가 없고,다른 이름이 출력 되지도 않을 것이다. 즉, Class는 하나 이지만, 그 것으로부터 생성된 Instance는 여러 개 일 수도 있다, 각각 다른 메모리에 위치한다. 그 곳이 어디냐면 Heap이라는 동적 메모리다.

  • new 키워드를 사용하여 인스턴스를 생성 한다.

 

 

힙 메모리(Heap Memory)


  • 생성된 인스턴스는 동적 메모리(Heap Memory)에 할당 된다. 할당 할 때, Java는 "new"를 쓰고, C++ new, C는 malloc을 쓴다. 그 메모리는 동적 메모리(Heap)라고 한다. 그 메모리는 쓰고 나서는 해제를 시켜야 한다.

위의 사진을 보면, System.out.println(studentKim);

System.out.println(studentLee);를 통해 Console창에 출력 해보면

36aa7bc2,76ccd017같은 것이 출력이 되는데 이것은 JVM이 만들어준 가상 주소다. studentLee같은 경우는 지역변수인데, 여기서 주소값을 가르치는 곳이 Instance의 주소값이라는 것이다.

그래서, studentLee라는 것을 참조변수라고 하고, Memory Address(36aa7bc2,76ccd017)를 참조 값이라고 한다.

생성된 인스턴스도 객체라고 부르는데, 그것은 객체라기 보단 인스턴스라고 부르는 것이 구별하기 좋다.

  • C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 한다(free()나 delete 이용)
  • 자바에서 Gabage Collector가 주기적으로 사용하지 않은 메모리를 수거한다.
  • 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 된다.

 

참고: FastCampus 

한 번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.

+ Recent posts