- join
- select
- mysql
- PYTHON
- springboot
- spring boot
- jpa
- sql
- Git
- 1차원 배열
- 스프링부트
- 문자열
- DI
- Django
- 프로그래머스
- SSL
- 데이터베이스
- java
- session
- Docker
- spring
- nginx
- string
- AWS
- spring mvc
- 자바
- 스프링
- @transactional
- ORM
- spring security 6
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
개발하는 자몽
객체와 메모리 in Java 본문
자바를 공부하면서 new 키워드 없이 객체를 생성하면(only declaration) 이 객체는 메모리를 할당받는지 궁금했다.
처음에는 단순히 이렇게 검색했다.
"자바 new 역할"
"자바 메모리 할당"
"자바 new 객체"
위와 같이 검색하면 new로 인스턴스화된 객체의 메모리 상태를 알려주는 글들이 수두룩하게 나온다.
하지만 내가 궁금했던 것은 인스턴스화 이후의 메모리 상태가 아니었기 때문에 친구에게 도움을 요청했다.
저렇게 검색 키워드 추천을 받고 다시 검색을 했다.
"JVM 메모리 할당"
"JVM declare memory"
JVM과 선언, 메모리 이 세가지 키워드를 함께 검색하니 글을 하나 발견했다.
글쓴이는 primitive type과 reference type을 선언만 했을 때 메모리가 할당되는지 물어봤다.
달린 답변 중 하나다.
- privmitive type의 변수는 선언 시 사이즈가 고정되어 메모리가 할당이 된다. 추후 사이즈 변경이 불가능하다.
- MyClass의 객체인 myObject(reference type, object)는 선언 시 null값을 갖게 되고, 메모리 할당이 되지 않는다.
답변을 보고 만족스러웠다. 클래스 객체를 선언만 했을 시 메모리에 할당이 되지 않는구나! 하지만 여기서 또 궁금한 점이 생겼다. 답변에서 메모리 할당이 되지 않는다고 했는데, 이 메모리는 heap을 뜻하는 것 같다. 그렇다면 선언만 된 클래스 객체는 stack에는 있을까? 그리고 그 객체는 타입인 클래스의 멤버 변수나 메서드들을 참조할 수 있을까?
검색하지 않고 혼자 생각을 했을 때, stack에는 존재할 것이다. myObject는 stack에서 null값을 갖고 있는 상태에서 이후 초기화 된다거나, 같은 타입의 객체를 참조할 수 있을 것이다.
혼자 고민하고, 검색해도 명확한 답이 보이지 않아서 스택오버플로우에 질문을 올렸다.
답변은
MyClass myObject;
이렇게 선언만 한 경우, myObject의 메모리 위치는 이 객체가 작성된 위치에 따라 결정된다(나의 경우 main이라고 가정하고 stack memory에 위치하는지 궁금했다). 객체가 메소드(method, constructor, initializer block or similar)밖에 놓였다면 class에 의해 저장된다고 답변이 달렸다. 메서드 안이라면 지역변수라고 하니 stack이다.
선언만 한 상태에서는 참조가 불가능하고 초기화를 해야한다고 한다!
궁금증이 해소되었다.. 후...
(검색하다가 좋은 자료 발견)
'Java' 카테고리의 다른 글
Wrapper 클래스 (0) | 2022.07.19 |
---|---|
[객체 지향] is-a, has-a (0) | 2022.07.16 |
static, singleton pattern (0) | 2022.07.15 |
스프링과 객체 지향 (1) - 자바 언어의 다형성 (0) | 2022.04.04 |
객체지향프로그래밍(추상화, 부품화, 은닉화, 캡슐화) (0) | 2021.12.23 |