컴파일 시점에서 크기가 정해져 있는 것
값을 가지고 있다.
컴파일 시점에서 크기가 정해져 있지 않는 것
컴파일 시점에서는 크기를 알 수 없고, 컴파일 후(.class) JVM에 실행했을 때 크기를 알 수 있다.
주소를 가지고 있다.
// new가 되어서 힙에 할당이 될 때 사이즈를 알 수 있다. (프로그램이 실행되었을 때 = 런타임)
class MyData {
int id = 1; // 4byte
int price = 1000; // 4byte
}
// 레퍼런스 변수, 일반 변수
public class VarRefEx01 {
public static void main(String[] args) {
// 타입 변수; -> 변수를 선언한다.
// 타입 변수 = 값; -> 변수를 초기화(메모리에 할당)한다.
int num = 10; // 일반 변수 (크기가 정해져 있는 것 = 컴파일 시점)
MyData d; // 레퍼런스 변수 (크기가 정해져 있지 않는 것 = 컴파일 시점)
}
}
다음과 같은 코드가 있다. 실재 메모리에 어떻게 로드가 되는지 동작 원리를 확인해보자
3 public class StackEx01 {
5 static void a() {
6 StackEx01.b(); // b() 호출
7 System.out.println("a2");
8 System.out.println("a3");
9 System.out.println("a4");
10 }
12 static void b() {
13 System.out.println("b1");
14 System.out.println("b2");
15 System.out.println("b3");
16 }
18 public static void main(String[] args) {
19 System.out.println("m1");
20 System.out.println("m2");
21 StackEx01.a(); // a() 호출
22 System.out.println("m4");
23 System.out.println("m5");
24 }
26 }