[패스트캠퍼스] [ static과 JVM 메모리 모델 이해하기 ] 나도 할 수 있는 Java&Spring 웹 개발 종합반 77 ~ 82강

2024. 5. 22. 11:30나도 할 수 있는 Java&Spring 웹 개발 종합반

728x90
반응형

 

1. static과 메모리의 관계

Q. 메인(시작) 클래스는 왜 객체생성(new) 없이 실행되는가?

A. 메인(시작) 클래스가 동작(실행)되는 방식을 이해해야 한다.

 1. JVM이 실행할 클래스를 찾는다

 2. static 키워드가 붙어있는 멤버들은 정해진 메모리(static-zone) 위치에 한번 자동으로 로딩한다

   -> static 멤버들은 클래스를 사용하는 시점에서 딱 한번 메모리에 로딩된다(★)

 3. JVM이 static-zone에서 main() 메서드를 호출한다

 4. 호출된 메서드를 Call Stack Frame Area (Stack Area)에 push(기계어 코드를 넣고) 한 뒤 동작을 시작한다\

  Call Stack Frame Area (Stack Area) : 

   - 메서드가 호출되면 호출된 기계어코드가 push되고 실행되는 메모리공간

   - 현재 프로그램이 실행되고 있는 상태를 파악할 수 있다

   - LIFO(Last-In-First-Out) 구조이다

 

 

main() -> 지역변수(local area)

stack에 아무것도 없으면 프로그램이 종료됨

stack에서 push-pop 이 이루어짐

 

static 멤버는 클래스를 사용하는 시점에서 자동으로 static-zone에 로딩된다

따라서 new를 이용해서 객체를 생성할 필요가 없다

2. static 멤버들의 접근방법

Q. none-static 메서드는 어떻게 접근하는가?

A. 객체를 생성해서 메모리에 로딩 시켜야 한다.

 

 

* Method Area

- 메서드의 기계어 코드가 할당되는 메모리 공간

- static 멤버들의 할당되는 메모리 공간

 

* Heap Area

- 객체가 생성(new)되는 메모리 공간

 

static 멤버접근방법 : 클래스이름.호출메서드

 

public class NoneStaticTest {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        NoneStaticTest st = new NoneStaticTest();
        int sum = st.hap(a, b);
        System.out.println("sum = " + sum);
    }

    public int hap (int a, int b) {
        int v = a + b;
        return v;
    }
}

sum = 30

 

3. private생성자와 static의 관계

자바 API에서는 :

1. private 생성자를 가지고 있는 클래스도 있다 (Ex: System, Math, 등)

2. 생성자는 반드시 public이진 않다

 

static은 객체생성과 관련이 없다

private 생성자 안은 다 static이어야 한다

public class AllStatic {
    public int hap(int a, int b) {
        int v = a + b;
        return v;
    }

    public int max(int a, int b) {
        return a > b ? a : b;
    }

    public int min(int a, int b) {
        return a < b ? a : b;
    }
}
import fc.java.model.AllStatic;

public class AllStaticTest {
    public static void main(String[] args) {
        AllStatic st = new AllStatic();
        System.out.println(st.hap(10, 20));
        System.out.println(st.max(10, 20));
        System.out.println(st.min(10, 20));
    }
}

30
20
10

 

보다 편리하게 하기 위해서

 

public class AllStatic {
    public static int hap(int a, int b) {
        int v = a + b;
        return v;
    }

    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    public static int min(int a, int b) {
        return a < b ? a : b;
    }
}

 

import fc.java.model.AllStatic;

public class AllStaticTest {
    public static void main(String[] args) {
        System.out.println(AllStatic.hap(10,20));
        System.out.println(AllStatic.max(10, 20));
        System.out.println(AllStatic.min(10, 20));
    }
}

30
20
10

 

이러한 방식이 바람직하다

 

public class AllStatic {
    private AllStatic() {

    }
    public static int hap(int a, int b) {
        int v = a + b;
        return v;
    }

    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    public static int min(int a, int b) {
        return a < b ? a : b;
    }
}
import fc.java.model.AllStatic;

public class AllStaticTest {
    public static void main(String[] args) {
        System.out.println(AllStatic.hap(10,20));
        System.out.println(AllStatic.max(10, 20));
        System.out.println(AllStatic.min(10, 20));
    }
}

30
20

10

 

private로 사용하여 객체 생성을 막을 수 있다

 

Max, Min 등 자바에서 제공하는 클래스도 있다

 

4. JVM이 사용하는 메모리 영역

 

Method Area :

- 메서드의 바이트코드(기계어 코드)가 할당되는 공간

- static-zone과 none-static-zone으로 나누어진다

- static 멤버들은 static-zone에 할당된다

 

Heap Area Generation :

- 객체가 생성되는 공간(new 연산자)

- GC(garbage collector)에 의해서 메모리가 수집된다

 

Thread (PC Register + Stack Area) :

- 메서드가 호출되면 메서드의 기계어코드를 할당받고(Native Method Area) 메서드가 실행되는 메모리공간(Call Stack Frame Area) (지역변수, 메개변수들이 만들어지는 공간)

- PC(Program counter)에 의해서 현재 실행중인 프로그램의 위치가 관리된다

- LIFO구조로 운영이 되는 메모리 공간 (메서드의 호출 순서를 알 수 있다)

 

RunTime Constant Pool (Literal Pool) :

- 상수 값 할당이 되는 메모리 공간

- 문자열 중 문자열 상수(리터럴)가 할당되는 메모리 공간

5. class, object, instance의 상호관계

Class : 객체를 모델링하는 도구 (설계도)

Object : 객체, 클래스를 통해서 선언되는 변수

instance(실체) : 객체생성에 의해 메모리에 만들어진 객체를 인스턴스라고 한다

 

이 셋은 서로 비슷한 개념으로 모두 객체를 나타내는 용어

 

 

 

 

728x90
반응형