- 변수 (int, double, boolean, String)
- static (main이 실행되기 전에 메모리에 로드) : 공간 분리 (class별로 구분)
- 정적, 하나만 메모리에 로드 가능함
- 메서드 (함수) : 4가지 유형
- 기본 함수 - void (리턴이 없는)
- 인수가 1개인 함수
- 인수가 여러 개인 함수
- 리턴이 있는 함수
1. Heap

코드 작성
package jvm;
class Student {
int no;
String name;
int age;
void show() {
System.out.println(no);
System.out.println(name);
System.out.println(age);
System.out.println();
}
}
public class Heap01 {
public static void main(String[] args) {
// new가 되면, static이 붙지 않은 모든 변수, 메서드가 heap에 로드됨
Student s1 = new Student();
s1.no = 1;
s1.name = "홍길동";
s1.age = 20;
s1.show();
Student s2 = new Student();
s2.no = 2;
s2.name = "철수";
s2.age = 16;
s2.show();
}
}
- class 내부의 객체를 static으로 선언하면, class는 하나밖에 로드할 수 없음
- class를 여러 번 호출하려면 static이 제거되야 함
- new 클래스명(); : class를 동적으로 호출, heap에 저장됨
- 이때, 호출한 클래스를 변수로 지정하기 위해 클래스명을 타입으로 사용
- 클래스명 변수명 = new 클래스명();
- 동적으로 호출한 class는 여러 번 호출 가능
결과

2. Stack

Main Body가 pop = 자바 프로그램 종료
코드 작성
package jvm;
public class Stack01 {
static void m1() {
int a = 1;
m2();
}
static void m2() {
int b = 1;
}
public static void main(String[] args) {
System.out.println("10번 라인");
m1();
System.out.println("12번 라인");
}
}
Stack Logic (FILO)
- main 실행
- m1 호출
- a = 1 초기화 (저장)
- m2 호출
- b = 1 초기화 (저장)
- m2 종료
- m1 종료
- main 종료
결과

스택 오버플로우
package jvm;
public class Stack02 {
static void m1() {
int a = 1;
m1(); // 재귀 함수 (Daemon)
}
public static void main(String[] args) {
m1();
}
}
Stack Overflow : Stack에 담을 수 있는 최대 용량을 넘어서 저장할 경우 오류 발생
- 위의 예시는 재귀함수를 통한 무한 호출로 인해 오류 발생
3. Queue

Stack vs Queue
Stack : FILO (First In Last Out), 변수 저장 공간
Queue : FIFO (First In First Out), 행위의 순서 저장
코드 작성
package jvm;
public class Queue01 {
static void m1() {
int n1 = 1;
System.out.println("🚒️");
System.out.println("🏍️");
System.out.println("️🚲");
m2();
System.out.println("🚅️");
System.out.println("✈️");
}
static void m2() {
int n2 = 2;
System.out.println("🍕");
System.out.println("🍔");
System.out.println("🌭");
System.out.println("🥚");
System.out.println("🧀");
}
public static void main(String[] args) {
// order : "main 시작" > m1 호출 = n1 생성 > 소방차, 오토바이, 자전거 출력 > m2 호출 = n2 생성 >
// 피자, 햄버거, 핫도그, 계란, 치즈 출력 > m2 종료 = n2 삭제 > 기차, 비행기 출력 > m1 종료 = n1 삭제 > "main 종료" > 종료
System.out.println("main 시작");
m1();
System.out.println("main 종료");
}
}
코드의 JVM Logic
- main stack 생성
- main queue 생성
- 25번 pop
- 26번 pop과 동시에 m1 호출
- m1 stack 생성
- m1 queue 생성
- 6번 pop : m1에 n1 = 1 저장 (4Byte)
- 7번 pop
- 8번 pop
- 9번 pop
- 10번 pop과 동시에 m2 호출
- m2 stack 생성
- m2 queue 생성
- 16번 pop : m2에 n2 = 2 저장 (4Byte)
- 17번 pop
- 18번 pop
- 19번 pop
- 20번 pop
- 21번 pop = end
- m2 queue 삭제
- m2 stack 삭제, 10번으로 복귀
- 10번 pop
- 11번 pop
- 12번 pop = end
- m1 queue 삭제
- m1 stack 삭제, 26번으로 복귀
- 26번 pop
- 27번 pop = end
- main queue 삭제
- main stack 삭제 = 프로그램 종료

결과

내용 정리
- Heap : main이 실행된 이후 호출한 클래스가 저장되는 공간
- main 이전에 실행 : static - 하나만 로드 가능
- Stack : 변수를 저장하는 저장 공간, FILO
- Queue : 클래스 내에서 메서드(함수) = 행위의 순서를 저장하는 공간, FIFO
- Queue는 변수를 저장하지 않음!
- Queue는 모든 행위가 pop되어야만 제거, Stack은 저장 공간이 사용되지 않을 경우 제거
- Stack이 push되면 Queue가 자동 생성, Queue가 제거되어도 Stack에서 사용하는 변수가 존재할 경우 Stack은 pop되지 않음
- Stack or Queue가 pop되고 삭제되면, 함수가 호출되었던 곳으로 return
Share article