[꼼꼼한 개발자] 꼼코더

08. 스프링 입문을 위한 자바 객체 지향의 원리와 이해 - [자바와 절차적/구조적 프로그래밍] - 구조적/절차적 프로그래밍 이해하기 본문

Spring/스프링 입문을 위한 자바 객체 지향의 원리와 이해

08. 스프링 입문을 위한 자바 객체 지향의 원리와 이해 - [자바와 절차적/구조적 프로그래밍] - 구조적/절차적 프로그래밍 이해하기

꼼코더 2022. 12. 27. 01:51
반응형

🔎 다시 보는 main() 메서드 : 메서드 스택 프레임

main() 메서드는 프로그램이 실행되는 시작점이다.

 

main() 메서드가 실행될 때 메모리, 특히 T 메모리에서는 어떤 일이 일어날까?

아래 예제 Start.java가 한 줄씩 실행될 때마다 T 메모리가 어떻게 변화하는지 살펴보자.

 

T 메모리 구조는 그림과 같다.

그림에서는 어떤 요소들이 각 영역을 사용하게 될지 비유적으로 표현했다.(해당 비유를 잘 기억하고 외우자)

  • JRE는 먼저 프로그램 안에 main() 메서드가 있는지 확인.
  • 존재한다면 JRE는 프로그램 실행을 위한 사전 준비, 다시 말 해 가상의 기계인 JVM에 전원을 넣어 부팅.
  • 부팅된 JVM은 목적파일을 받아 그 ‘목적 파일을 실행’.
  • JVM은 가장 먼저 java.lang 패키지를 T메모리의 스태틱 영역에 가져다 놓는다.
  • 그리고 나서 JVM은 개발자가 작성한 모든 클래스와 import pakage 역시 스태틱 영역에 가져다 놓는다.

🧹 정리

main() 메서드가 실행되기 전 JVM에서 수행하는 전처리 작업들

  • java.lang 패키지를 T 메모리의 스태틱 영역에 배치.
  • import된 패키지를 T 메모리의 스태틱 영역에 배치.
  • 프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치.

❓ 1번째 시도 “System.out.println("Hello OOP!");“ 구문 실행

그럼 이제 main() 메소드의 첫 줄인 “System.out.println("Hello OOP!");“구문이 실행될까?

아직은 아니다. 메서드의 놀이터는 스택이다.

 

메서드가 놀기위한 공간인 ‘스택’에 ‘스택 프레임이 할당’ 된다.

여는 중괄호를 만날 때마다스텍 프레임이 하나씩 생겨난다. (클래스 정의를 시작하는 여는 중괄호는 제외)

 

 


❓ 2번째 시도 “System.out.println("Hello OOP!");“ 구문 실행

그럼 이제 main() 메서드의 첫 줄인 “System.out.println("Hello OOP!"); “구문이 실행될까?

아직 하나의 작업이 남았는데.

 

바로 메서드의 인자 args를 저장할 변수 공간을 스택 프레임이 맨 밑에 확보해야 한다.

즉, 메서드 인자(들)의 변수 공간을 할당하는 것이다.

 

그림처럼 T 메모리를 구성하고 나야 main() 메서드의 명령문이 실행된다.

아주 간단한 일이지만 JRE, JVM은 매우 바빴다.

  • JRE : JVM이라는 자바 가상 기계 부팅
  • JVM : 메모리 구조 생성, java.lang 패키지 로딩, 각종 클래스 로딩, main() 메서드 프레임 패치, 변수 공간 배치 등등

 

그럼 “System.out.println("Hello OOP!")” 이 실행되면 T 메모리는 어떻게 될까?

사실 큰 변화가 없다. 이유인즉슨 메모리에서 코드 실행 골간은 별도로 있었다.

그리고 우리는 거기에 관심을 두시 않기로 했었다.

 

굳이 언급하자면“System.out.println();” 구문이 실행되면 GPU(그래픽 처리 장치)에 화면 출력을 의뢰한다.

이때 데이터 저장 공간인 T 메모리에는 아무런 변화가 없다. 그림을 보면서 이해해 보자.

 

  • 블록의 시작 기호인 여는 중괄호 ‘{’를 만났을 때 메서드의 스택 프레임이 생긴다.
  • 블록의 닫는 기호인 닫는 중괄호 ‘{’를 만났을 때 메서드의 스택 프레임이 소멸된다.

 

아래 그림은 main() 메서드의 스택 프레임이 소멸된 후의 T 메모리를 보여준다.

 

main() 메서드가 프로그램의 시작점이라고 했는데 끝이기도 하다.

main() 메서드가 끝나면 JRE는 JVM을 종료하고, JRE 자체도 운영체제 상의 메모리에서 사라진다.

그럼 T 메모리도 자연스레 사라지게 된다

 


🧹 핵심 내용 정리

  • T 메모리 구조
  • java.lang 패키지
  • import 패키지와 클래스들
  • 메서드 스택 프레임
  • JVM
  • JRE

 

근데 T 메모리의 힙(Heap) 영역은 언급하지 않았다.

OOP에서 클래스와 객체를 이야기 이후에 아주 중요한 영역이지만 지금은 잠시 넘어가도록 한다.

 
Comments