[디자인패턴] static, heap, stack, queue 구분

이나겸's avatar
Nov 12, 2024
[디자인패턴] static, heap, stack, queue 구분

JVM 자바가상머신

 
notion image
 
  • JAR안에 들어가있음
  • JDK 설치하면 크게 JRE, 컴파일러로 나뉨
    • JRE (자바런타임환경) : 라이브러리, JVM 들어있음
    • 컴파일러 : javac(java compiler) 들어있음
  • app에서 .java → .class파일로 컴파일하고 JVM으로 전달, JVM에서 OS로 전달, OS에서 HW(하드웨어)로 전달
    • .java 파일은 HDD에 저장되고 인간이 이해 가능 (개발자가 작성함)
    • .class(바이트코드로 구성) 파일은 JVM이 이해 가능 (컴퓨터는 이해 불가능)
  • java는 하이브리드 언어 (인터프리터 + 컴파일러)
    • 인터프리터 : javac에 의해 변환된 .class파일 내의 바이트코드를 특정 환경의 기계에서 실행될 수 있도록 변환
    • 컴파일러 : javac가 .java파일 → .class파일로 변환
  • RAM 안에서 static, heap, stack, queue 라는 공간이 만들어짐

1. static : 정적

  • 프로그램 실행전에 메모리에 띄우고 싶으면(로드하고 싶으면) static
  • static의 생명주기는 프로그램 종료까지 (생명이 제일 길어서 제일 무거운 데이터) ⇒ 프로그램 실행전부터 종료까지 계속 띄워져있어야하는 데이터를 static달아줌
  • JVM이 클래스 로드 → static을 찾음 → main 찾아서 실행

2. heap : new 하면 heap 공간 생성

  • 해당 클래스에서 static이 아닌것을 메모리에 띄우는 것 (static이 아닌것을 갖다쓸 수 있음)
  • heap은 heap이 위치한 stack에 저장됨

3. stack : 데이터 후입선출 (입 : push, 출 : pop)

  • 매개변수(파라미터 안)는 stack에 저장됨
  • 메소드가 호출될 때 queue와 함께 생성, 메소드 종료되면 queue와 함께 삭제 ⇒ 지역 변수
    • 중괄호 열리면 stack 생성, 닫히면 stack 삭제 ⇒ 생명주기가 짧음 (메소드 안에 위치한 if, for도 stack이 따로 생성됨)
  • stack 삭제되면 데이터도 없어지므로 데이터를 return하던가 heap에 옮겨두던가
  • stack이 pop되지않고 계속 쌓여서 공간을 다 쓰면 stackoverflow

4. queue : 데이터 선입선출 (입 : push, 출 : pop)

  • 코드를 순서대로 실행하려고 만들어짐 (메소드 실행되는동안 queue에서 코드 순차 실행)
  • 메소드가 실행되면 queue가 열림 ⇒ main이 실행되면 main queue, method1이 실행되면 method1 queue
  • main queue는 main의 실행 주기를 들고있음 ⇒ main queue 닫히면 프로그램 종료
public class JvmTest { // 이 경우 프로그램 실행시 띄워져있는것(로드되어있는것)은 num2, main int num1 = 1; static int num2 = 2; // 파라미터 안의 매개변수 num3는 method1의 stack에 저장됨 // method1의 중괄호 열리면 stack이 생성, 중괄호가 닫히면 stack 삭제 // => 지역변수 // stack 삭제되면 데이터도 없어지므로 데이터를 return하던가, heap에 옮겨두던가 void method1(int num3) { System.out.println("num3 : " + num3); int num4 = 4; System.out.println("num4 : " + num4); } // main 시작전에 static인 num2가 로드 되어있음 public static void main(String[] args) { // main queue는 main의 실행 주기를 들고있음 // => main queue 닫히면 프로그램 종료 System.out.println("JVM Start"); System.out.println("num2 : " + JvmTest.num2); // new를 붙여놓으면 해당 클래스에서 static이 아닌것을 갖다쓸 수 있음 // => num1, method1 JvmTest jt = new JvmTest(); System.out.println("num1 : " + jt.num1); jt.method1(3); } }
 
Share article

Nakyeom's Study