본문 바로가기
JAVA

static, heap, stack?

by 김마리님 2020. 3. 20.

자바의 메모리는 크게 세 영역으로 나뉘는데, static, heap, stack가 그것이다.

자바는 JVM이라는 가상머신이 머신코드로 class 파일을 읽는데, 읽고 실행하는 순서가

1. 코드 스캔 : static 파일 찾기

2. main 메서드 실행

으로 진행된다.

 

따라서 main 함수가 실행되기 전에 스캔되는 static은 프로그램이 로드 되기 전부터 메모리에 떠있는 값이다.

static으로 선언된 변수는 프로그램이 종료되기 전까지 불러올 수 있다. 따라서 static 내의 변수는 전역변수라고 한다. 

heap는 가상의 공간에 떠있다가, main 함수로 호출이 되면 메모리로 로드가 된다. 이 때 heap를 부르는 명령어가 new이다. heap은 더이상 main이 내부 클래스를 참조하지 않을 때, 사라진다. 따라서 heap는 공간이 호출되고 사라지기 전까지는 외부에서 변수를 호출할 수 있으므로 전역변수이다.

 

 

stack 공간은 호출된 메서드 내부의 값이다. 따라서 stack공간은 메서드가 호출될 때 메모리 공간이 생겼다가, 메서드 호출이 끝나면 사라진다. 이렇게 사라지면, 더이상 외부에서 메서드 내부의 변수를 참조할 수 없게 된다. 따라서 이런 변수를 지역변수라고 한다.

 

 

 

 

예를 들어 다음과 같은 code가 있다고 가정하자.

package ch03;

public class Mem {
	
	int num=10;
	
	static String name="홍길동";
	
	void test() {
		int num=5;
	}
	
	public static void main(String[] args) {
		int sum=100;
		System.out.println("sum : "+sum);
		Mem m=new Mem();
		m.test();
		System.out.println("번호 : "+m.num);
		System.out.println(1);
		System.out.println(2);
		System.out.println("프로그램 종료");
	}
}

메모리를 읽는 플로우는 다음과 같이 진행된다.'

1. 프로그램이 로드 되며 전역변수인 static이 메모리 위에 입력된다.

이 때, static 공간은 클래스 마다 생성된다. 이 예시에는 class가 하나 뿐이므로 static 공간이 하나 뿐이고, 그 내부에 static로 선언된 변수 name과 main이 입력된다.

 

2. static로드가 끝나면 main메서드가 진행된다.

이 때 main을 자세히 보면 매서드의 형태를 띄고 있다. 따라서 main은 지역변수를 가지는 매서드이다. 따라서 stack 공간이 메모리에 생긴다.

 

3. new 를 이용하여 heap 공간이 새로 호출된다. 

(이 때, heap로 뜨는 데이터는 static 공간에 있는 데이터를 제외한다.)

 

4. m.test를 통해 매서드가 호출되며 새로운 stack 공간이 열린다. 이 stack는 괄호 끝에서 종료를 가지거나, return 명령어를 만나면 종료된다.

 

5. 더이상 참조되지 않는 heap 공간이 삭제된다.

 

이렇게 더 이상 사용되지 않는 메모리를 쓰레기 공간이라고 하는데, 이것을 자바는 자동으로 종료해준다. 이 것을 garbage collection이라고 한다.

C언어의 경우 메모리를 종료시키지 않고 개발자가 임의로 삭제해야하는데, 이 같은 언어를 unmanaged language라고 한다. 반대로 자바처럼 언어에서 garbage collection이 되는 언어를 managed language라고 한다.

 

6. 프로그램이 종료되며 static도 사라지게 된다. 

반응형

'JAVA' 카테고리의 다른 글

5. 반복문  (0) 2020.03.23
call by value passing? call by reference passing?  (0) 2020.03.23
4. 메서드  (0) 2020.03.20
3. 조건문  (0) 2020.03.20
2. JAVA의 연산  (0) 2020.03.20