자바의 메모리는 크게 세 영역으로 나뉘는데, 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 |