JVM에는 3개의 메모리 영역이 있다
1. code영역
2. heap영역
3. stack영역
클래스에 있는 모든것들을 메모리에 로딩할 때, 클래스 안에 있는 메서드들의 명령문들을 code 영역에 저장한다.
흔히 Method영역이라고도 불리며, 컴파일 된 소스파일이 실행될 때 JVM안에서 일어나는 과정이 포함된다.
test.java (컴파일)
-> test.class (실행)
-> Class Loader
-> Byte Code verifier
-> Interpreter / Just-In-Time compiler
-> Runtime System
new 명령문으로 만들어지는 인스턴스들이 사용하는 메모리 영역이다.
인스턴스 = 설계된 class를 new명령문으로 생성한 대상
heap영역에 저장되는 클래스의 멤버변수들은 만들어 질 때마다 자동으로 초기화된다.
지역변수들이 사용하는 메모리 영역이다.
메소드가 실행될 때 stack 영역안에 메모리가 생성되고
메소드가 종료될 때 stack 영역안에 메모리가 삭제된다.
개발자들이 주로 접근할 수 있는 영역은 stack영역이다. 그러므로 heap영역에 있는 인스턴스들을 접근할 때는 참조변수를 사용한다.
참조변수 = heap 메모리의 주소값을 가지고 있는 변수
예제 코드
public void test(){
Test t = new Test();
}
t라는 지역변수에 new로 생성된 Test()인스턴스에 대한 주소값을 저장시킨다.
호출 방법 : t.멤버변수 , t.메서드()
static은 변수, 메서드 앞에 선언될 수 있다.
static이 선언된 변수, 메서드 들은 프로그램이 실행 되기 전에 이미 code 영역에 메모리가 생성된다.
static 변수들은 class 변수라고도 부를 수 있으며, static 메서드는 프로그램 실행 전 사용준비가 완료된 메서드라고 볼 수 있다.