본문 바로가기
Java/정리

[Java] 메모리구조 & 참조변수

by 콧등치기국수 2021. 5. 3.

1. 메모리 구조

메모리 공간은 Static영역, Stack영역, Heap영역으로 구분되고, 데이터타입(자료형)에 따라서 해당 공간에 할당된다. 

 

1) Static

하나의 JAVA 파일은 크게 필드(field), 생성자(constructor), 메소드(method)로 구성된다.

필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다.

Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다. 

다르게 말하면 전역변수가 프로그램이 종료될 때까지 어디서든 사용이 가능한 이유이기도 하다.

따라서 전역변수를 무분별하게 많이 사용하다 보면 메모리가 부족할 우려가 있어 필요한 변수만 사용할 필요가 있다.

 

 

2) Heap

참조변수 내용 저장됨(참조형의 데이터 타입을 갖는 객체(인스턴스), 배열 등)

Heap영역에는 실제 데이터 값이 저장되고, 그 데이터의 참조값(=주소값)을 Stack이 갖고 있다.

따라서 참조형 변수값을 출력할때는 stack에서 주소값을 읽고, heap에서 그 주소에 해당하는 값을 가져오게 된다.

 

* new연산자를 통해서 배열 할당 → 메모리 heap영역에 배열크기만큼 공간 생성  주소값(stack영역 레퍼런스 변수에 저장)도 같이 부여

→ 배열에 값 추가, 수정 해당 주소 참조해서 사용(바로 heap영역에서 값 가져올 수 없음)

 

 

3) Stack

메소드 내 기본자료형 지역변수의 데이터 값이 저장되는 공간 / 주소값이 저장된다.

해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. 

 Stack 영역은 LIFO(Last In First Out)의 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.

 

1) stack영역 - 지역변수의 데이터 값 저장

public class A_Array {

	public void method1() {
		
		//일반변수 선언
		int i = 5;  //메모리공간에 값을 기록해놓기 위한 공간 --> 그 메모리 중 Stack영역에 할당

2) stack영역 - 배열의 주소값 저장

public class A_Array {

	public void method1() {
		
		//1.배열 선언
		int[] iArr;  //배열을 선언하게 되면 변수선언과 마찬가지로 stack영역에 박스가 생김, 
        			 //이 박스는 실제 값이 아닌 주소를 보관하는 공간

 

 

[참고] [JAVA/자바] 메모리 구조(static, stack, heap)|작성자 JOKER

 

 

 

2. 참조변수, 변수

1) 참조변수 : 주소값을 담는 변수

                  기본 자료형 외 자료형(String, int[ ], 배열)

                  

2) 변수 : 진짜 값(리터럴)을 담는 변수

            기본 자료형(boolean, char, byte, short, int, long, float, double)로 선언한 변수

 

 

 

 

 

'Java > 정리' 카테고리의 다른 글

[Java] 입력 버퍼 비우기(Next(), NextLine())  (0) 2021.05.04
[Java] IdentityHashcode & Hashcode  (0) 2021.05.03
9회차_반복문(do ~ while문)  (0) 2021.04.19
7회차_제어문(switch문_return/break 차이)  (0) 2021.04.19
[Java] 연산자  (0) 2021.04.12