개발하는 자몽

객체와 메모리 in Java 본문

Java

객체와 메모리 in Java

jaamong 2022. 7. 14. 15:51

자바를 공부하면서 new 키워드 없이 객체를 생성하면(only declaration) 이 객체는 메모리를 할당받는지 궁금했다. 

 

처음에는 단순히 이렇게 검색했다.

"자바 new 역할"

"자바 메모리 할당"

"자바 new 객체"

 

위와 같이 검색하면 new로 인스턴스화된 객체의 메모리 상태를 알려주는 글들이 수두룩하게 나온다.

하지만 내가 궁금했던 것은 인스턴스화 이후의 메모리 상태가 아니었기 때문에 친구에게 도움을 요청했다.

 

책 추천까지 받았다

 

저렇게 검색 키워드 추천을 받고 다시 검색을 했다.

"JVM 메모리 할당"

"JVM declare memory"

 

JVM과 선언, 메모리 이 세가지 키워드를 함께 검색하니 글을 하나 발견했다.

 

 

JVM allocates memory at declaration for primitive types, but not for non-primitive types?

I am from a C/C++ background and very new to java, I am having difficulty in understanding variable declaration and memory allocation in java. when we write, myclass myobject; we declare that my...

stackoverflow.com

 

글쓴이는 primitive type과 reference type을 선언만 했을 때 메모리가 할당되는지 물어봤다.

내기준 가장 명쾌한 답변

달린 답변 중 하나다.

  • privmitive type의 변수는 선언 시 사이즈가 고정되어 메모리가 할당이 된다. 추후 사이즈 변경이 불가능하다.
  • MyClass의 객체인 myObject(reference type, object)는 선언 시 null값을 갖게 되고, 메모리 할당이 되지 않는다.

답변을 보고 만족스러웠다. 클래스 객체를 선언만 했을 시 메모리에 할당이 되지 않는구나! 하지만 여기서 또 궁금한 점이 생겼다. 답변에서 메모리 할당이 되지 않는다고 했는데, 이 메모리는 heap을 뜻하는 것 같다. 그렇다면 선언만 된 클래스 객체는 stack에는 있을까? 그리고 그 객체는 타입인 클래스의 멤버 변수나 메서드들을 참조할 수 있을까?

검색하지 않고 혼자 생각을 했을 때, stack에는 존재할 것이다. myObject는 stack에서 null값을 갖고 있는 상태에서 이후 초기화 된다거나, 같은 타입의 객체를 참조할 수 있을 것이다.

 

혼자 고민하고, 검색해도 명확한 답이 보이지 않아서 스택오버플로우에 질문을 올렸다.

 

When just declaring objects, it locates in stack?

I am very new to Java, and I am having difficult understanding memory allocation in Java. I have two main questions. first question When we write, MyClass myObject; If I just declare myObject, is ...

stackoverflow.com

 

답변은

MyClass myObject;

이렇게 선언만 한 경우, myObject의 메모리 위치는 이 객체가 작성된 위치에 따라 결정된다(나의 경우 main이라고 가정하고 stack memory에 위치하는지 궁금했다). 객체가 메소드(method, constructor, initializer block or similar)밖에 놓였다면 class에 의해 저장된다고 답변이 달렸다. 메서드 안이라면 지역변수라고 하니 stack이다.

선언만 한 상태에서는 참조가 불가능하고 초기화를 해야한다고 한다!

 

궁금증이 해소되었다.. 후...

 

 

 

 

 

(검색하다가 좋은 자료 발견)

 

JVM의 메모리 구조 및 할당과정

JVM 구조 JVM은 다섯 가지 컴포넌트로 구성되어 있다. 클래스 로더 시스템 : 컴파일 결과로 만들어진 .class 바이트코드 파일을 읽어들여 메모리에 배치. 로딩, 링크, 초기화 세 가지 과정을 거친다.

inspirit941.tistory.com

 

JVM에 관하여 - Part 2, ClassLoader

Java 로 작성한 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 2편, JVM 의 구성 요소 중 ClassLoader 에 관한 글입니다. 이번 글에서는 ClassLoader…

tecoble.techcourse.co.kr

 

Comments