🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • Stack?
  • JVM의 Stack
  1. 백엔드
  2. Java
  3. 2장 자바 메모리구조

1. Stack

Previous2장 자바 메모리구조Next2. Heap

Last updated 7 months ago

Stack?

Stack이란 쌓다라는 의미를 가졌습니다. 자료구조에서 Stack은 값을 하나하나 쌓아 나가다가 마지막에 들어간 값 먼저 순차적으로 처리하는 LIFO(Last In First Out)구조를 가졌습니다. 이Stack에 데이터를 추가할때는 push함수를, stack에 저장된 데이터를 꺼낼 때는 pop이라는 함수를 사용하여 작동합니다.

Stack구조는 비유하자면 탑처럼 쌓인 팬케이크와 비슷합니다. 팬케이크의 가장 아래에는 가장 먼저 만들어진 팬케이크가 존재하며 , 식사시에는 가장 마지막에 만들어진 꼭대기의 팬케이크를 우선적으로 먹게됩니다.

JVM의 Stack

JVM의 Stack메모리도 컴퓨터과학의 Stack을 참고하여 만들어졌기 때문에 동일한 방식으로 작동합니다. 그럼 이 Stack에는 어떤 데이터가 쌓이게 되는걸까요? 바로 호출된 메소드가 순차적으로 들어가게 됩니다. 이때 가장 먼저 실행된 main메서드가 항상 Stack의 최하단에 존재하게 되며, 가장 최근 실행된 메소드가 Stack의 최상단에 들어가게 됩니다.

다음 코드를 통해 알아보겠습니다.

public class TestStack{

    public static void main(String[] args){
        methodA();
    }
    
    public static void methodA(){        
        methodB();
    }
    
    public static void methodB() {
        methodC();
    }
    
    public static void methodC(){

    }    
}

위 코드에서 가장 먼저 실행되는 메서드는 무엇일까요?

가장 먼저 실행되는 함수는 main메서드입니다. 모든 java 어플리케이션의 entry point는 main메서드이기 때문이죠. 따라서 Stack에는 다음과 같이 main메서드가 가장 먼저 쌓이게 됩니다.

그 다음은 어떤 메서드가 호출될까요?

main 메서드 내부에서 호출하는 메서드가 순서상 다음으로 실행될 메서드겠죠. 즉 methodA가 다음순서로 Stack에 쌓이게 됩니다. 그다음은 methodA에서 호출한 methodB가 쌓이고 마지막은 methodC가 순서에 맞춰서 쌓이게 되겠죠.

위 그림처럼 더 이상 호출할 메서드가 없다면 이제 맨 위에 쌓인 메서드별로 처리해야할 작업을 처리합니다. 현재는 실행할 기능자체가 없기 때문에 쌓인 순서의 역순으로 methodC -> B -> A -> main순으로 실행된 후 프로그램이 종료됩니다.

이렇게 호출된 각 메소드에는 해당 메소드만을 위한 공간이 할당되며 이를 스택프레임이라고 부릅니다. 스택프레임에는 메서드에서 사용되는 변수, 매개변수, 리턴값 등 해당 영역안에서 사용하는 변수의 값을 저장하고 사용하며 , 메소드 호출이 종료되는 시점에 맞춰서 스택프레임과 그 안에 저장된 값들 또한 함께 소멸하게 됩니다.

아래 코드를 도식화 시켰을 때의 이미지를 확인해보겠습니다.

public class TestStack{
    public static void main(String[] args){
        // main메서드 내부의 지역변수
        int a = 1;
        int b = 2;
        int c = 3;
    }
}

위 처럼 stack영역 안에는 해당 영역에서 선언된 변수들이 저장되며 메소드가 종료되는 순간 함께 제거가 됩니다. 즉, stack영역은 간단하게 설명하자면 임시로 사용하는 변수의 정보를 저장하는 저장공간이라고 할 수 있습니다.

PANCKAE STACK
출처 :
https://www.geeksforgeeks.org/stack-data-structure/