public class MemoryArchitecture {
// ======================== Field ===============================================================
int n1 = 10; // Member Variable(Intance Variable) => 클래스를 생성할때 힙에 올라가는 변수
String s1= "Hello"; // Member Variable(Intance Variable)
static int n2= 10; // Class Variable // => class 변수들은 JVM 의
static String s2= "Java"; // Class Variable // Method 영역에서 클래스가 로드될떄 같이 생성
static final int n3= 20; // final로 선언하면 Class Variable은 상수로 치환되어 Constant Pool 복사
static final String s3= "C++"; // final로 선언하면 Class Variable은 상수로 치환되어 Constant Pool 복사
// ======================== 메소드 내부 안은 로컬 영역 ===============================================
public static void t1(int a) { // parameter Variable
int a1; // local Variable
int b2; // local Variable
}// end main
} // end class
자바는 변수들이 Runtime 시점시에 자바 메모리에 크게
stack 영역 - local Variable , Parameter Variable
class(Methoed) 영역 - Class Variable (static Variable)
heap 영역 -Member Variable(Instance Variable)
위 구조로 메모리 영역에 들어갑니다.
흔히 필드라고 불리는 곳은 class에서 메소드 내부 안이 아니라 클래스의 내부에서 선언한
멤버 변수 , 클래스 변수라고 합니다.
Class 변수(Static 변수로)는 class 파일을 실행할 때 JVM의 클래스 영역에서 이미 메모리를 할당되어서
JVM에 꺼질떄까지 계속 메모리에 상주합니다.
Member 변수(Class 변수는)는 MemoryArchitecture의타입으로 객체가 생성될때 같이 메모리에 올라가서
참조가 끊길떄까지 계속 메모리에 올라갑니다. ->가비지 컬렉터가 메모리를 수거하기 전까지 메모리에 올라감
Static final 로 선언한 Class Variable은 JVM의 Class 영역 중에 상수풀로 복사되어서 계속 메모리에 상주합니다.
=> final 로 선언하면 한번 초기화하면 다시 초기화가 불가능합니다.