1. 메모리 영역
1.Method Area
.class 파일을 로딩한 메타데이터를 가지고 있는 공간.
프로그램 실행시 컴파일타임을 통한 소스에 안정성을 확인하고
static 변수를 static 영역에 준비하고 static 메소드 호출을 한다.
2.Heap Area
new 키워드 통한 객체생성시 생성되는 인스턴스변수가 실제적인 메모리에 올라오게
되는 공간으로 클래스 로딩후 stack 영역에 로딩된 클래스 메소드와 레퍼런스 변수를
통한 접근이 가능.
3.Static Area
static 으로 선언된 변수 또는 메소드의 정보가 있는 공간으로 접근제한자를 public 으로
열어둘시 어떤 클래스에서든지 클래스이름.변수,메소드 이름으로 접근이 가능하고
같은의미로는 각 객체마다 데이터밑 메소드가 공유되는 공간이다.
4.Stack Area
프로그램 시작점인 메인메소드가 호출 되는 공간이며 클래스 파일 로딩시
static으로 선언되지 않은 메소드가 준비 되는 공간이다. 메인메소드 내에서
클래스 객체 생성시 로딩을 통한 멤버변수 메소드 정보를 갖게 되며 레퍼런스 변수를통
메소드에 접근 힙영역에 실체화된 인스턴스 변수에 데이타를 전달 한다.
ex)
Num클래스에 멤버변수에 인스턴스 변수와 Static 변수(클래스 변수)를 선언
각 각 멤버 변수의 값을 1씩 증가시키는 increseNum() 선언
Count 클래스에서 main메소드를 호출 하고 각 Num클래스의 객체 n1,n2를 생성
각각 의 객체에서 increseNum()를 호출 하고 있다
각 객체에 num값과 static 변수에 num2 에 접근 출력한결과
각 객체에 num값은 1이출력되었지만 static 변수 num2 의 값은 2가 되었다.
결국 static 변수는 static 영역에 존재하며 각각의 객체에서 데이타가 공유 되는것을 알수
있다. 고로 Static 변수는 별도의 객체 생성없이 클래스 이름만으로 접근이 가능하다(단,public으로 열려있어야함)
*.java파일을 컴파일하면 메소드 실행가능여부를 검사후 메소드 영역에 메타데이터로 로딩
(static 변수나 메소드는 static 영역에 준비된다)
*JVM에 의해서 런타임시 생성되는 객체의 클래스 정보를 참조 메소드가 Stack영역에
로딩 되고 각 객체는 힙영역에 생성되는 인스턴스 변수에 주소 값을 갖는다.
댓글 없음:
댓글 쓰기