[JAVA] 6. JVM 사전지식

편준민's avatar
Feb 03, 2025
[JAVA] 6. JVM 사전지식
  1. 변수 (int, double, boolen, String)
  1. static (main이 실행되기 전에 메모리에 로드) - 공간 분리(class별로 분리되어있음)
    1. static은 정적이고 한 개만 메모리에 로드. (중간에 로드 되거나, 2번 로드 되지 않음)
  1. 메서드(함수)의 유형
      • 기본 함수
      • 인수가 한 개인 함수
      • 인수가 여러 개인 함수
      • 리턴이 있는 함수
      • void(리턴이 없는)

1. heap

package jvm; // 클래스 자료형 : 이름, 나이, 학생번호 // static이 안 붙으면 HDD에만 올라가 있어 작업 불가능 class Student { int no; String name; int age; } public class Heap01 { public static void main(String[] args) { // new가 되면 static이 붙지 않은 모든(변수, 메서드)가 heap에 로드 Student s1 = new Student(); s1.no = 1; s1.name = "홍길동"; s1.age = 18; System.out.println(s1.no); System.out.println(s1.name); System.out.println(s1.age); System.out.println(); Student s2 = new Student(); s2.no = 2; s2.name = "고길동"; s2.age = 24; System.out.println(s2.no); System.out.println(s2.name); System.out.println(s2.age); } }

heap에 로드하는 문법

  • class명 변수명 = new class명();
package jvm; class m1{ m1 s1 = new m1(); //heap에 로드하는 문법 int no; } class m2{ System.out.println(s1.no); } public class Heap01 { public static void main(String[] args) { } }
💡
위에 코드에서 class m1 안에서 new m1();으로 인해 m1이 heap에 로드는 되었지만 s1 이라는 변수로 저장되고, s1 변수는 m1 class 안에 저장이 되어서 heap 로드 되었지만class m2, s1이라는 변수를 찾을 수 없기 때문에 class m2에서는 s1.no 을 불러올 수 없다.

heap에 로드했을 때 장점

  • static에 로드하면 한 번만 로드 되고 그 이후에는 로드 할 수 없기 때문에 같은 클래스를
    • 반복 사용하지 못한다. 하지만 heap에 로드 하면 같은 클래스를 메모리에 여러 공간을 사용해서 반복해서 사용 할 수 있다.
  • heap 공간은 수명이 다하면 사라지기 때문에 메모리를 효율적으로 사용 할 수 있다.
package jvm; class Student { int no; String name; int age; static 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) { Student s1 = new Student(); s1.show(); s1.no = 1; s1.name = "홍길동"; s1.age = 18; } }
static을 넣으면 오류가 뜨는 이유 정리
// ① public class Heap01 { public static void main(String[] args) { Student s1 = new Student(); s1.show(); s1.no = 1; s1.name = "홍길동"; s1.age = 18; } }
위와 같이 넣으면 show(); 안에 no, name, age 를 출력하고 s1.no에 1을 다시 대입하는 구조다. 하지만 show(); 안에 no, name, age에 값이 없기 때문에 오류가 난다.
❓ 그치만 s1.show();를 s1.age = 18; 아래로 내린다면?
// ② public class Heap01 { public static void main(String[] args) { Student s1 = new Student(); s1.no = 1; s1.name = "홍길동"; s1.age = 18; s1.show(); } }
해당 코드는 s1.(변수)들의 값을 채우고 show();를 호출 하는 것임으로, 문법상 오류가 없는 코드 이지만, 오류가 나는 이유는 개발자가 s1.show();를 ① 코드 처럼 만들지, ②코드 처럼 만들지 모르기 때문에 툴 자체에서 오류로 처리하여 실행시키지 못하게 만들었다.

2. stack

package jvm; public class Stack01 { static void m1() { int a = 1; // 메인에서 호출 하면 실행 m2(); // main, class m1, m2 , 변수 a, b 가 로드되어 있음. } static void m2() { int b = 2; } public static void main(String[] args) { System.out.println("10번 라인"); m1(); System.out.println("14번 라인"); } }

실행 원리

  1. main 코드를 실행
  1. m1 class 호출
  1. m1 코드를 실행
  1. int a = 1; 코드를 실행하여 m1 stack 공간에 저장하고 m2 class 호출
  1. m2 코드 실행 후 종료
  1. m2 코드 종료 후 더 필요 없으니 m2 stack 공간 삭제
  1. m1도 코드 실행 후 필요 없으니 m1 stack 공간 삭제
  1. main도 코드 실행 후 필요 없으니 main stack 공간 삭제
package jvm; public class Stack02 { static void m1() { int a = 1; m1(); // 복귀함수 } public static void main(String[] args) { m1(); } }
위와 같은 원리는 똑같다. 하지만 m1의 함수 안에서 m1을 또 호출 하기에 프로그램은 영원히 끝나지 않는다.
  1. main 코드 실행
  1. m1 class 호출
  1. int a = 1; 를 m1 stack에 저장
  1. m1 class 호출
  1. 3번과 4번의 반복으로 끝나지 않는 프로그램임.

3. queue

 
package jvm; public class Queue01 { static void m1() { int n1 = 1; System.out.println("🚒️️"); //1 System.out.println("🏍️"); //2 System.out.println("🚲️"); //3 m2(); System.out.println("🚅️"); //9 System.out.println("✈️"); //10 순으로 나올 것 이다. } static void m2() { int n2 = 2; System.out.println("🍕"); //4 System.out.println("🍔"); //5 System.out.println("🌭"); //6 System.out.println("🥚"); //7 System.out.println("🧀"); //8 } public static void main(String[] args) { System.out.println("main 시작"); m1(); System.out.println("main 종료"); } }
notion image

    4. 참조자료형

     
     
    디버깅 하는 법
    1. 오류는 밑에서 터져서 위에서 부터 추적
       
       
      Share article

      YunSeolAn