개발이군고구마

[JVM] Static (자바 메모리 구조) 본문

SERVER/Java

[JVM] Static (자바 메모리 구조)

김구황 2025. 2. 10. 07:54
728x90

1. 문제 상황 

  • 프로젝트 프론트 API 통신 결과는 특정 어노테이션을 붙혀서 inner 클래스로 매핑시켜서 받는 구조이다. 
  • 어노테이션 뒤에 해당 값을 받아오는 클래스를 정의하고
  • -> 클래스에 선언된 멤버필드에 프론트에서 받아온 변수들이 매핑되는 로직
public ExResponse practice(@RequestModel ExRequest.class Exdto dto) {
    ...
}

 

  • 이때 inner 클래스에 static 변수를 붙혀주지 않으면 에러 발생

=> 왜 inner 클래스는 static 변수를 붙혀주어야 하는 걸까? 

 

 

2. 자바의 메모리 구조 

골든래빗 - 자바 코드와 메서드, 스태틱 변수 등은 메모리의 어디에 위치할까?

 

JVM 로딩되는 순간 작성한 코드들은 자바의 메모리에 각각 나누어 저장된다. 

런타임 영역에는 

  • 클래스 메서드 등의 실행코드 
  • static, 상수 관련 정보가 저장되며 
  • 프로그램의 모든 영역에서 공유하고 
  • JVM이 종료될 때 까지 생명주기가 이어진다. (= 가장 긴 생명주기)

 

스택 영역은 

  • 자바 실행 즉, 스레드가 코드 한줄 한줄을 실행할 때 스택 프레임이 생성되어 하나씩 쌓이게 되며 
  • 실행이 완료되면 지역변수, 매개변수는 제거 된다. 

 

힙 영역은 

  • 인스턴스와 배열이 생성되는 영역으로 
  • GC가 이루어지는 주요 영역이다. 
  • new Instance()를 선언해주어서 참조하는 형태로 쓰이는 공간

 

 

3. 문제가 되었던 코드 

API 호출을 받은 후 해당 메서드는 스택 프레임에 쌓인다. 

프론트에서 가져온 데이터를 매핑시키기 위해 inner Class 로 선언한 ExRequest 클래스를 사용해야하지만, 

static 이 없는 클래스를 호출하기 위해선 인스턴스를 생성해야한다. 

사용해야하 하는 ExRequest 클래스가 static으로 선언되지 않았을 때

 

 

하지만 해당 코드에선 인스턴스를 생성하지 않은 상태로 클래스를 사용해야하므로 

static을 붙혀 JVM 로딩시에 런타임 영역에 바로 로딩해준 후에,

모든 프로그램이 공유할 수 있게 만들어논다. 

 

static 변수를 붙혀 inner 클래스를 생성해줘야

 

 

 

public ExResponse practice(@RequestModel ExRequest.class Exdto dto) {
    ...
}
private static class ExResponse {
}

private static class ExRequest {
}

 


 

참고 

https://goldenrabbit.co.kr/2021/11/03/%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8A%A4%ED%83%9C%ED%8B%B1-%EB%B3%80%EC%88%98-%EB%93%B1%EC%9D%80-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EC%96%B4%EB%94%94/

 

자바 코드와 메서드, 스태틱 변수 등은 메모리의 어디에 위치할까? - 골든래빗

자바에서 사용하는 메모리 모델의 구조를 이해하면 자바 프로그래밍에 큰 도움이 됩니다. 그러나 모든 것을 자세히 알 필요는 없습니다. 우리가 공부한 것과 연관해 서 필요한 개념만 조금 이해

goldenrabbit.co.kr