무작정 개발.Vlog

[Java] Stack, Heap

by 무작정 개발
반응형

이번 글에서는 이전 글 [Java] JVM와 바이트 코드에서 나온 스택(Stack), 힙(Heap) 그리고 Static(정적)에 대해 정리할 것이다.

우연히 어떤 분이 정리를 매우 쉽게 해 주신 글을 보게 되어 그 글을 참조하여 작성하였다.

Java를 보다 깊게 이해하기 위해 다시 한번 복습하면서 글을 작성 중입니다.
기초적인 내용은 다루지 않을 예정입니다.

Stack(스택)

Stack 이란 Java 프로그램에서 메서드가 호출될 때 메서드의 스택(Stack) 프레임이 저장되는 영역이다.

JVM은 Java 프로그램에서 메서드가 호출되면, 메서드의 호출과 관계되는 지역 변수(로컬 변수)와 매개 변수를 스택 영역에 저장한다.

  • 요약 : 행위가 끝나면 소멸되는 정보 (임시 저장소)

 

Heap (힙)

  • 동적 할당과 동적 소멸이 일어나는 공간이라 말할 수 있다.
  • Java 프로그램 실행 중 생성되는 인스턴스(new 연산자)는 모두 Heap 영역에 생성된다.

 

Static

  • 정적 이라는 의미를 가지고 있다.
  • 끝까지 가져가고 싶은 정보. 내가 어떤 프로그램을 짤 때 계속 그 자리에 있어야 하는 정보

 

Staic, Stack, Heap을 자판기에 비유 설명

Staic, Stack, Heap을 자판기에 비유 설명
출처 https://blog.naver.com/ysh3872/222614849898

EX)

음료수를 빨리 마시기 게임이 있다.

게임을 진행하기 위해 일단 게임 중에 계속 있어야 하는 물건 즉, 자판기를 [ Static ]이라 할 수 있다.

1번 참가자가 먼저 나와서 게임에 참여한다. 1번 참가자는 음료수를 마시고 빠지기 때문에 계속 있을 필요가 없기에 static(정적)이 아니다.

왜냐하면 1번 참가자는 음료수를 마시기 게임을 도전 후에 다음 참가자가 들어오기 때문에 "동적 할당"으로 잠시 Heap(경기장)에 

들어와서 음료수를 마신다. 1번 참가자는 음료수를 마시는 시간이 2분이 걸렸다. Stack(스택)은 이 2분 동안 음료수를 마시는 시간을 재주고 "2분" 이라는 값을 가지고 있다. 하지만 음료수를 다 마셨으니 "2분"이라는 기록은 Stack에서 떠나야 한다.

하지만 빨리 마시기 게임은 "기록"이 가장 중요하다. 이때 1번 참가자가 달성한 "2분"이라는 기록은 Heap 메모리에 들어가서 저장되고

1번 참가자는 경기장(Heap)에서 떠난다. (동적 소멸)

 

-> Java는 메모리 공간을 효율적으로 쓰기 위해 이렇게 작동된다. 사용할 필요가 없는 정보를 삭제하면서 메모리 공간을 유지해 준다.

이렇게 버려진 정보, 동적 소멸한 정보 등을 삭제해주는 것이 GC(가비지 컬렉터) 이다.

 

 

Java의 main 함수

 

public class Java {
    public static void main(String[] args) {
        System.out.println("main 함수 실행!");
    }
}

Java라는 이름을 가진 클래스(Class)를 생성하였고, 그 안에는 main 함수가 있다.

이 코드를 실행하면 어떻게 될까?

먼저 Java를 실행하기 위해서는 main 함수가 있어야 한다.

  1. JVM은 실행(시작) 시에 main 함수만 찾는다.
  2. main 함수는 무조건 static 키워드가 붙어야 JVM이 찾을 수 있다. (static 이면 객체 생성이 필요가 없다)
  3. main 함수가 실행되면 main 스택이 열린다.
  4. {  } 사이를 main 스택 영역이라고 말할 수 있다.
  5. main의 내부 소스 코드가 순차적으로 실행된 후에 Java가 종료된다. (Stack 안에 있는 영역이 순차적으로 열리는데 이를 "절차적 시행"이라고 부르며 한 줄 한 줄 실행한다.

Reference

네이버블로그-코딩농장

반응형

'Language > Java' 카테고리의 다른 글

[Java] main 함수  (1) 2022.10.24
[Java] Call by Value, Call by Reference  (1) 2022.10.11
[Java] Java는 compile 언어? interpreter 언어?  (0) 2022.10.10
[Java] JVM와 바이트 코드  (0) 2022.10.04
[Java] JDK, JRE 이란?  (0) 2022.10.03

블로그의 정보

무작정 개발

무작정 개발

활동하기