[꼼꼼한 개발자] 꼼코더
08. 스프링 입문을 위한 자바 객체 지향의 원리와 이해 - [자바와 절차적/구조적 프로그래밍] - 구조적/절차적 프로그래밍 이해하기 본문
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에서 클래스와 객체를 이야기 이후에 아주 중요한 영역이지만 지금은 잠시 넘어가도록 한다.